Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.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 如何在不保存的情况下持续修改queryset的切片_Python_Django_Python 3.x - Fatal编程技术网

Python 如何在不保存的情况下持续修改queryset的切片

Python 如何在不保存的情况下持续修改queryset的切片,python,django,python-3.x,Python,Django,Python 3.x,我正在转换(突出显示查询匹配项)搜索结果查询集中对象的content属性。在枚举过程中对查询集中的每个对象变换属性时,至少在查询集中的生命周期内,变换将持续。出于显而易见的原因,我没有应用save,因为我只希望转换在请求期间在queryset的生命周期内保持不变 当我尝试将枚举优化为queryset的片段时,问题就出现了,然后转换不再(暂时)持续 有没有办法让转换也为切片持久化 为什么我的转换对于一个片段的处理与对于完整查询集的处理不同 queryset的切片仍然是queryset,尽管它没

我正在转换(突出显示查询匹配项)搜索结果查询集中对象的
content
属性。在枚举过程中对查询集中的每个对象变换属性时,至少在查询集中的生命周期内,变换将持续。出于显而易见的原因,我没有应用save,因为我只希望转换在请求期间在queryset的生命周期内保持不变

当我尝试将枚举优化为queryset的片段时,问题就出现了,然后转换不再(暂时)持续

  • 有没有办法让转换也为切片持久化
  • 为什么我的转换对于一个片段的处理与对于完整查询集的处理不同
queryset的切片仍然是queryset,尽管它没有等价性 到原始queryset,即使它是整个queryset的一部分

  • 使用Django 1.11.4和Python 3.6.3
下面是一个演示一般问题的示例:

class Passage(models.Model):
    content = models.CharField(max_length=256)

Passage.objects.create(content='test 1')
Passage.objects.create(content='test 2')

In [1]: results = Passage.objects.filter(id__lte=2)
In [2]: for result in results:
   ...:     result.content = "hello world"
   ...:
In [3]: [result.content for result in results]
Out[3]: ['hello world', 'hello world']
In [4]: results = Passage.objects.filter(id__lte=2)
In [5]: for result in results[0:2]:
   ...:     result.content = "hello world"
   ...:
In [6]: [result.content for result in results]
Out[6]: ['test 1', 'test 2']

编辑queryset的切片不会影响原始queryset,因为切片是一个单独的queryset对象;这两个查询集是惰性计算的,不共享内存中的模型对象
results
将为您提供一个queryset对象,
results[0:2]
返回一个单独的queryset对象,当您在其中一个对象上迭代时,另一个对象的结果不会受到影响,因为它们是在您迭代时生成的(并缓存在queryset对象上,这就是第一个示例工作的原因)

根据数据的大小,您可以通过使用enumerate进行迭代来获得所需的效果:

for i, result in enumerate(results):
    if i < 2:
        result.content = 'hello world'
对于i,结果为枚举(结果):
如果i<2:
result.content='hello world'

不幸的是,我无法重现您的问题我已经用真实的示例更新了示例。无法重现错误。您必须做一些不同的事情,无论如何,问题现在已经解决了–您无法使用切片来重现问题,因为原始的queryset与切片的qs不同。如果您能够,那么您必须已经将切片分配给一个var并对其进行枚举,或者与问题描述中描述的内容不同。