Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.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
Django force在queryset上使用缓存_Django_Django Queryset - Fatal编程技术网

Django force在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

我使用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 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(..)
之后,但如果您将进一步过滤它,则无法缓存它。