Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在使用.values_list()时,使用[n:]和[n:end]对QuerySet进行切片会得到不同的结果_Python_Django - Fatal编程技术网

Python 在使用.values_list()时,使用[n:]和[n:end]对QuerySet进行切片会得到不同的结果

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

在纯python中,
[n://code>和
[n:len(mylist)]
是等价的。然而,对于Django
QuerySet
,情况并非如此

我遇到了这个问题:

# 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")