我很难理解为什么我不能在查询集上的切片之后进行过滤,以及发生了什么。
stuff = stuff.objects.all()
stuff.count()
= 7
如果我走了
extra_stuff = stuff.filter(stuff_flag=id)
extra_stuff.count()
= 6.一切都很好,我有我的新queryset在extrastuff没有问题
stuff = stuff.objects.all()[:3]
extra_stuff = stuff.filter(stuff_flag=id)
我收到错误"一旦获取了切片,就无法筛选查询"。
如何进一步过滤限制了结果数量的查询集?
4条答案
按热度按时间falq053o1#
在对查询集进行切片之后,就不能再使用
filter()
了,错误非常明显。您可以使用Python执行过滤器
要获取extra_stuff中的数量或项目,只需使用
len()
当
stuff
的大小很小时,在Python中进行过滤就可以很好地工作,就像这个例子一样,如果你有一个更大的切片,你可以使用一个子查询,但是这也可能会有性能问题,你必须进行测试。kupeojn62#
Django给你这个错误是因为它已经从数据库中检索到了条目。
filter
方法只对在实际执行之前细化数据库查询有用。因为你只得到三个对象,你可以在Django中做额外的过滤:
但我想知道为什么切片前不过滤一下。
v6ylcynt3#
我先做了过滤,然后创建另一个变量,像这样切片:
额外填充物=填充物.对象.过滤器(填充物标志=id)
切片填充物=额外填充物[:3]
它工作良好
ux6nzvsh4#
只需执行2个查询。
``
注意,如果extra_stuff_count是一个数,如3或300。因为,它需要更多的内存来实现更多的计数(在这种情况下,只需再发出一个请求)。