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

问题描述 投票:0回答:1

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

输出:

qs.first()

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

qs.last()

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

python-3.x postgresql django-queryset django-orm
1个回答
0
投票

使用值**('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')

希望对你有帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.