Django force在queryset上使用缓存
我使用Django queryset进行切片。我想对它求值一次,然后使用缓存的结果 代码如下:Django force在queryset上使用缓存,django,django-queryset,Django,Django Queryset,我使用Django queryset进行切片。我想对它求值一次,然后使用缓存的结果 代码如下: items_filtered = Item.objects.filter(......) items_filtered_sliced = items_filtered[:100] items_filtered_sliced_updated = Item.objects.filter(pk__in=items_filtered_sliced).update(....) 我以后需要使用“items\u
items_filtered = Item.objects.filter(......)
items_filtered_sliced = items_filtered[:100]
items_filtered_sliced_updated = Item.objects.filter(pk__in=items_filtered_sliced).update(....)
我以后需要使用“items\u filtered\u sliced”查询集对其进行过滤,因此为了防止过滤切片查询集(这是不可能的),我想使用查询集的第一个结果,并尝试了这个方法-
items_filtered_sliced2 = Item.objects.filter(pk__in=items_filtered_sliced)
但是,似乎“items\u filtered\u sliced”会再次求值,并返回下一个100,而不是返回上一个结果。您可以使用列表(…)
强制求值QuerySet
。您甚至只能在中的pk\u中执行此操作,这仍然会强制对已筛选的项目进行评估:
items_filtered = Item.objects.filter(…)
items_filtered_sliced = items_filtered[:100]
Item.objects.filter(pk__in=list(items_filtered_sliced)).update(…)
for item in items_filtered_sliced:
# do something
print(item)
items\u filtered=Item.objects.filter(…)
items\u filtered\u sliced=items\u filtered[:100]
Item.objects.filter(pk\u in=list(items\u filtered\u sliced)).update(…)
对于项目中的项目\u过滤\u切片:
#做点什么
打印(项目)
这是因为迭代、计算长度等都“使用”了QuerySet
,而QuerySet
将在内部将记录存储在列表中
但是,如果您执行额外的筛选等操作,则不会使用缓存。因此,如果您将用于项目中的项目\u filtered\u sliced.all():
,它将再次对数据库进行新的查询。您可以使用列表(…)
强制计算查询集
。您甚至只能在
中的pk\u中执行此操作,这仍然会强制对已筛选的项目进行评估:
items_filtered = Item.objects.filter(…)
items_filtered_sliced = items_filtered[:100]
Item.objects.filter(pk__in=list(items_filtered_sliced)).update(…)
for item in items_filtered_sliced:
# do something
print(item)
items\u filtered=Item.objects.filter(…)
items\u filtered\u sliced=items\u filtered[:100]
Item.objects.filter(pk\u in=list(items\u filtered\u sliced)).update(…)
对于项目中的项目\u过滤\u切片:
#做点什么
打印(项目)
这是因为迭代、计算长度等都“使用”了QuerySet
,而QuerySet
将在内部将记录存储在列表中
但是,如果您执行额外的筛选等操作,则不会使用缓存。因此,如果您将用于items\u filtered\u sliced.all():
,它将再次对数据库进行新的查询。谢谢。关键是我需要将结果作为queryset,因为我以后需要在需要queryset的函数中对其进行过滤。@user2880391:那么您就不能缓存它了。因为Django不知道这些过滤器实际上是如何工作的。.filter(…)
所做的就是将其转换为SQL查询。因此Django不知道如何使用过滤器处理模型对象列表。请注意,item\u filtered\u sliced
是一个QuerySet
,也是在.update(..)
之后,但如果您要进一步过滤它,则无法缓存它。谢谢。关键是我需要将结果作为queryset,因为我以后需要在需要queryset的函数中对其进行过滤。@user2880391:那么您就不能缓存它了。因为Django不知道这些过滤器实际上是如何工作的。.filter(…)
所做的就是将其转换为SQL查询。因此Django不知道如何使用过滤器处理模型对象列表。请注意,item\u filtered\u sliced
是一个QuerySet
,也是在.update(..)
之后,但如果您将进一步过滤它,则无法缓存它。