Python 在使用.values_list()时,使用[n:]和[n:end]对QuerySet进行切片会得到不同的结果
在纯python中,Python 在使用.values_list()时,使用[n:]和[n:end]对QuerySet进行切片会得到不同的结果,python,django,Python,Django,在纯python中,[n://code>和[n:len(mylist)]是等价的。然而,对于DjangoQuerySet,情况并非如此 我遇到了这个问题: # ci is a QuerySet In [88]: id_name_value = list(ci[ci.count() - 1000:].values_list("id", "attributes__name", "attributes__value")) In [89]: len(id_name_value) Out[89]: 72
[n://code>和[n:len(mylist)]
是等价的。然而,对于DjangoQuerySet
,情况并非如此
我遇到了这个问题:
# ci is a QuerySet
In [88]: id_name_value = list(ci[ci.count() - 1000:].values_list("id", "attributes__name", "attributes__value"))
In [89]: len(id_name_value)
Out[89]: 7254
In [90]: id_name_value = list(ci[ci.count() - 1000 : ci.count()].values_list("id", "attributes__name", "attributes__value"))
In [91]: len(id_name_value)
Out[91]: 1000
行为明显不同的地方。在这种情况下,[n:QuerySet.count()]
给了我想要的,而[n:://code>做了其他的事情,但它做什么呢
编辑:
我从以下渠道获得的项目:
In [4]: temp = ci[ci.count()-1000:]
# and
In [6]: temp_2 = ci[ci.count()-1000: ci.count()]
同样,当我应用.values_list()
时,差异会显现出来。如果你使用qs[n://code>,那么它会给你最后的n
对象,反之[:n]
会给你第一个n
对象
此外,如果您执行qs[o:l]
,则o
是一个偏移量,l
是一个限制
例如qs=[0,1,2,3,4,5,6,7,8,9]
first = qs[:3]
# first == [0, 1, 2]
last = qs[3:]
# last == [7, 8, 9]
offset = qs[2:6]
# offset = [3, 4, 5]
这些可以在限制查询集的中找到。这里的问题是您正在从相关的模型属性获取值
values_list("id", "attributes__name", "attributes__value")
这意味着ID将在结果中重复。对于每个相关属性,每个id将显示一次
因此,您会得到两个不同长度的列表,因为ci.count()
(唯一ID的数量)与值queryset(具有重复项)的长度不同
要获取values queryset的最后1000个值,可以执行以下操作:
ci[ci.values_list("id", "attributes_name", "attributes_value").count() - 1000:].values_list("id", "attributes__name", "attributes__value"))
或
请注意,第二个查询集的项目顺序相反。“如果您执行qs[n:],那么它将为您提供最后的n”,即最后的qs.count()-n
元素,对吗?qs.count()-n
将是剩下的部分,因为您将从原始查询集中获得最终n
元素的新查询集。@Akavall如果您只调用,您会得到什么。values\u list('id',flat=True)
如果我执行temp=ci[ci.count()-1000:。values\u list(“id”,flat=True)
,我将获得values\queryset
,和temp.count()
==1000。因此问题(问题)并非真正出现在.values\u list()
上,而是当涉及到“attributes\u name”,“attributes\u value”
时。谢谢你的回答,但我仍然不明白为什么ci[ci.count()-1000:
和ci[ci.count()-1000:ci.count()
应用.values\u list()
后会导致不同的结果。我正在使用ci.count()
对ci
进行切片,为什么在应用.values\u list()
后会发生什么?你实际上不是在切片ci
,而是在切片最终的查询集。ci.values\u list(…)[x:]
将生成与ci[x:]相同的结果。值列表(…)
。由于重复,值查询集的条目数比ci多。将切片后的长度与[ci.count()-1000::
和[ci.count()-1000:ci.count()]的长度进行比较与比较[n:
和的结果不同[n:len(mylist)]
,因为值queryset的长度不等于ci.count()。
ci.reverse()[:1000].values_list("id", "attributes__name", "attributes__value")