提问人:Vanshita Lavange 提问时间:11/17/2023 最后编辑:Vanshita Lavange 更新时间:11/17/2023 访问量:38
Django 查询集长度为 1,但执行 .first() 和 .last() 返回两个不同的对象
Django queryset length is 1 but doing .first() and .last() return two different objects
问:
遇到异常行为 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}
答:
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')
希望对:)有所帮助
评论