按反向关系的注释字段对查询集进行排序

Sorting querysets by annotated field of reverse relation

我有 2 个模型,Form 和 Row,每个 Row 都有一个 FK 到一个 Form。 我想按添加最后一行的时间对我的表单进行排序。

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')

注解后需要调用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 来更改 order by 行为。有关详细信息,请参阅此 SO post、Django: Adding “NULLS LAST” to query