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

时间:2020-05-04 13:59:06

标签: django django-queryset django-orm

我有2个模型,分别是Form和Row,每行都有一个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 个答案:

答案 0 :(得分:2)

注释后,您需要调用order_by()方法。

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

更新:

在查询集的开头看不到新创建的Form实例的一种可能原因是,某些Row对象可能没有 created_at 值,因此成为第一位。在这种情况下,可以通过设置 nulls_last=True 来更改顺序行为。有关更多详细信息,请参阅此SO帖子Django: Adding “NULLS LAST” to query

相关问题