Django 查询集长度为 1,但执行 .first() 和 .last() 返回两个不同的对象

Django queryset length is 1 but doing .first() and .last() return two different objects

提问人:Vanshita Lavange 提问时间:11/17/2023 最后编辑:Vanshita Lavange 更新时间:11/17/2023 访问量:38

问:

遇到异常行为 django ORM 查询。打印时过滤的查询集仅显示一个值,但是当我尝试在该查询集上执行 .first() 和 .last() 时,它显示了两个不同的值

在下面的查询中,我有一个文档表,其中有外键 --> user_id 一个用户可以在文档表中拥有多个条目。我想在给定user_id的文档表中查找最新的条目 ID。 查询集只显示一个项目,但执行 .first() 显示的项目甚至不是查询集的一部分。为什么会有这种行为?

qs = Document.objects.filter(user_id=1537).values('user_id').annotate(max_id=Max('id'))

输出:<QuerySet [{'user_id': 1537, 'max_id': 37}]>

qs.first()

输出: {'user_id': 1537, 'max_id': 33}

qs.last()

输出: {'user_id': 1537, 'max_id': 37}

python-3.x postgresql django-queryset django-orm

评论

0赞 nulzo 11/17/2023
first() 文档提到了这一点,并且它们包含有关它的注释。同样,order_by() 文档更深入地解释了它。

答:

0赞 Maimoona Abid 11/17/2023 #1

使用 values**('user_id')**(这会导致无序的查询集)是导致意外行为的原因。不能保证执行 first() 或 last() 的结果是最大值。因此,按“-max id”排序以保证正确的排序。 试试这个;

qs = Document.objects.filter(user_id=1537).values('user_id').annotate(max_id=Max('id')).order_by('-max_id')

希望对:)有所帮助