gpt4 book ai didi

django - 对于单个元素的查询集,索引 (query_set[0]) 和 query_set.first() 的第 0 个元素会给出不同的值 - Django 2.2.7

转载 作者:行者123 更新时间:2023-12-04 07:15:08 25 4
gpt4 key购买 nike

我正在运行此代码:

        city_state_location = (
Location.objects.filter(city=city, state=state)
.values_list("city")
.annotate(long=Avg("longitude"), lat=Avg("latitude"))
)
print(
city_state_location,
city_state_location[0],
city_state_location.first(),
len(city_state_location),
)
哪些输出:
<QuerySet [('New York', -73.9422666666667, 40.8382)]>
('New York', -73.9422666666667, 40.8382)
('New York', -73.9501, 40.8252)
1
为什么会发生这种情况?查询集只包含一个元素,所以我很困惑为什么索引第一个元素与调用 .first() 不同
这是在 Django 2.2.7 上运行的

最佳答案

Why does this happen?


与普遍看法相反, .first()[0]是不同的。确实, .first()将添加 .order_by('pk')子句,以防您没有正确排序查询集,因此没有 GROUP BY city ,因为主键是排序过程的一部分,所以第一项只是第一个 Location满足给定过滤条件的按主键排序的对象,以及 Avg('longitude')Avg('latitude') .事实上,如果我们看一下 source code of .first() [GitHub] , 我们看:
def first(self):
"""Return the first object of a query or None if no match is found."""
for obj in (self if self.ordered else self.order_by('pk'))[:1]:
return obj

因此将返回第一项的经度和纬度。
使用 [0]另一方面,不会添加额外的 .order_by('pk') ,因此返回的项目是满足过滤条件的第一组项目的项目,因此将确定指向 'New York' 的所有项目的平均值。在这种情况下。
如果您使用过 city_state_location.order_by('pk')[0] ,然后会发生与使用 .first() 相同的情况.

关于django - 对于单个元素的查询集,索引 (query_set[0]) 和 query_set.first() 的第 0 个元素会给出不同的值 - Django 2.2.7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68809625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com