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