python django -在结果受限的查询集上切片/过滤后过滤

new9mtju  于 2023-01-16  发布在  Python
关注(0)|答案(4)|浏览(103)

我很难理解为什么我不能在查询集上的切片之后进行过滤,以及发生了什么。

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)

我收到错误"一旦获取了切片,就无法筛选查询"。
如何进一步过滤限制了结果数量的查询集?

falq053o

falq053o1#

在对查询集进行切片之后,就不能再使用filter()了,错误非常明显。

Cannot filter a query once a slice has been taken.

您可以使用Python执行过滤器

stuff = stuff.objects.all()[:3]
extra_stuff = [s for s in stuff if s.stuff_flag=='flag']

要获取extra_stuff中的数量或项目,只需使用len()

extra_stuff_count = len(extra_stuff)

stuff的大小很小时,在Python中进行过滤就可以很好地工作,就像这个例子一样,如果你有一个更大的切片,你可以使用一个子查询,但是这也可能会有性能问题,你必须进行测试。

extra_stuff = Stuff.objects.filter(id__in=stuff, stuff_flag='flag')
kupeojn6

kupeojn62#

Django给你这个错误是因为它已经从数据库中检索到了条目。filter方法只对在实际执行之前细化数据库查询有用。
因为你只得到三个对象,你可以在Django中做额外的过滤:

extra_stuff = [s for s in stuff if s.stuff_flag==id]

但我想知道为什么切片前不过滤一下。

v6ylcynt

v6ylcynt3#

我先做了过滤,然后创建另一个变量,像这样切片:
额外填充物=填充物.对象.过滤器(填充物标志=id)
切片填充物=额外填充物[:3]
它工作良好

ux6nzvsh

ux6nzvsh4#

只需执行2个查询。
``

total_stuff = StuffClass.objects.count()
extra_stuff = StuffClass.filter(stuff_flag=id)[:3]
extra_stuff_count = len(StuffClass.filter(stuff_flag=id))

注意,如果extra_stuff_count是一个数,如3或300。因为,它需要更多的内存来实现更多的计数(在这种情况下,只需再发出一个请求)。

相关问题