【问题标题】:Sorting querysets by annotated field of reverse relation按反向关系的注释字段对查询集进行排序
【发布时间】:2020-08-18 23:38:20
【问题描述】:

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

【问题讨论】:

    标签: django django-queryset django-orm


    【解决方案1】:

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

    【讨论】:

    • 我现在补充一下,我忘了提。我正在使用它,但它似乎不起作用。顺序发生了变化,但是当我添加新行时,它不会出现在查询的前面。
    • " 我添加了一个新行,它没有出现在查询的前面..." 您添加了哪个实例? Form 或 Row?
    • 好吧,例如,如果我使用 created_at=now() 添加一行,我希望相应的表单成为订购后的第一个表单,但这不会发生。
    • 所以我发现我的代码工作正常,除了有些表单没有提交,django 认为 None 大于任何日期:))
    • 在这种情况下,使用这种排序技术,Django: Adding “NULLS LAST” to query
    猜你喜欢
    • 2019-01-13
    • 2022-06-28
    • 1970-01-01
    • 2018-03-15
    • 2011-03-23
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    相关资源
    最近更新 更多