Сортировка наборов запросов по аннотированному полю обратной связи - PullRequest
0 голосов
/ 04 мая 2020

У меня есть 2 модели, форма и ряд, каждая строка имеет FK для формы. Я хочу отсортировать свои формы по времени добавления последней строки.

class Form(models.Model):
    ...

class Row(models.Model):
    form = models.ForeignKey(
        Form,
        related_name="rows",
    )
    created_at = models.DateTimeField(
        auto_now_add=True,
    )

Я пробовал это, но это не работает:

queryset = Form.objects.filter(is_empty=False)
queryset = queryset.annotate(last_submit=Max("rows__created_at")).order_by('-last_submit')

1 Ответ

2 голосов
/ 04 мая 2020

После аннотации вам нужно вызвать order_by() метод.

sorted_qs = Form.objects.filter(is_empty=False
                                ).annotate(last_submit=Max("rows__created_at")
                                           )<b>.order_by('-last_submit')</b>

Обновление:

Одна из возможных причин не видеть Вновь созданный экземпляр Form в начале набора запросов: некоторые из объектов Row могут не иметь значения created_at, поэтому оно становится первым. В таких ситуациях вы можете изменить порядок с помощью поведения , установив nulls_last=True. Для получения более подробной информации см. Этот пост SO, Django: добавление «NULLS LAST» к запросу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...