У меня есть поле в модели roll_numb. Поле roll_numb имеет следующие значения.

070-001
070-007
070-343
080-002
080-008

Когда я order_by roll_numb, сортировка происходит так, как описано выше. Я хочу разделить roll_numb на - и отсортировать по остатку. (т.е. 001, 002, 008)

Код

class Meta:
        ordering = ['roll_numb']

A.J.

Ответов: 2

Ответы (2)

Я думаю, что невозможно упорядочить queryset по методу model в ORM-области Django.

Для того, чтобы отсортировать ваш queryset по вашему пользовательскому методу, я рекомендую 2 способа:

Первый

qs = mymodel.objects.all()
qs = sorted(qs, key: lambda i: i.roll_numb().split('-')[1])

Второе

Добавьте еще одно поле в вашу модель, чтобы ORM Django мог сортировать по нужному значению:

MyModel(models.Model):
    class Meta:
        ordering = ['roll_numb_splitted']

   roll_numb_splitted = models.Charfield(max_length=3)

   def save(self, *args, **kwargs):
        # this is a check to run once
        if not self.pk:
            self.roll_numb_splitted = self.roll_numb().split('-')[1]
        return super(MyModel, self).save(*args, **kwargs)

Аннотируйте набор запросов с помощью пользовательского поля:

from django.db.models.functions import Substr

YourModel.objects.annotate(roll_split=Substr('roll_numb', 5)).order_by('roll_split')

Если вы хотите, чтобы всегда ваши модели были упорядочены, просто переместите эту аннотацию в менеджер модели:

class YourModelManager(models.Manager):
    def get_queryset(self):
        qs = super(YourModelManager, self).get_queryset()
        return qs.annotate(roll_split=Substr('roll_numb', 5)).order_by('roll_split')

class YourModel(models.Model):
    objects = YourModelManager()

2022 WebDevInsider