Django: упорядочить объект, зависящий от двух значений

#python #django #django-models

#python #django #django-модели

Вопрос:

Итак, у меня есть это:

 class Thread(models.Model):
    first_thread_notification = models.IntegerField(default=0)
    second_thread_notification = models.IntegerField(default=0)
  

Мне нужно упорядочить объекты в зависимости от суммы 2 объектов:

 class Meta:
    ordering = ['-first_thread_notification'   '-second_thread_notification']
  

Я знаю, что это неверно, но как я могу это сделать?

Редактировать

 class ManagerSum(models.Manager):
    Thread.objects.annotate(
       total=ExpressionWrapper(
       F('first_thread_notification')   F('-second_thread_notification'), 
       output_field=IntegerField(),
       )
    ).order_by('-total')

class Thread(models.Model):
    first_thread_notification = models.IntegerField(default=0)
    second_thread_notification = models.IntegerField(default=0)

    total_notifications = ManagerSum()

class Meta:
    ordering = ['-total_notifications']
  

правильно ли это?

Ответ №1:

Вы можете использовать аннотацию, чтобы суммировать их с помощью выражения F.

 from django.db.models import IntegerField, ExpressionWrapper
Thread.objects.annotate(
    total=ExpressionWrapper(
        F('first_thread_notification')   F('-second_thread_notification'), 
        output_field=IntegerField(),
    )
).order_by('-total')
  

Комментарии:

1. Итак, мне нужно добавить его в мета-класс или в класс модели?

2. К сожалению, нет, прочитайте эту часть документации: docs.djangoproject.com/en/3.1/topics/db/managers/… Это должно помочь вам на правильном пути.