在Django中动态更改QuerySet对象

pro*_*ink 5 django django-views

可以或者我应该在视图中做到这一点吗?

a = SomeTable.objects.all()
for r in a:
    if r.some_column == 'foo':
        r.some_column = 'bar'
Run Code Online (Sandbox Code Playgroud)

它就像一个冠军,但我在其他地方尝试了类似的东西,我得到了奇怪的结果,暗示QuerySet对象不喜欢被嘲笑.并且,我没有在文档中看到任何关于这种技巧的好坏.

我知道还有其他方法可以做到这一点,但我特别想知道这是不是一个坏主意,为什么它是坏的,如果它确实很糟糕,什么是"最好的"django/pythonic改变价值观的方式苍蝇会.

Dan*_*man 6

只要您以后不执行任何操作会导致重新评估查询集(例如,对其进行切片),这就没问题了.这将对数据库进行另一次查询,并且所有修改过的对象将被替换为新的对象.

保护自己的一种方法是首先转换为列表:

a = list(SomeTable.objects.all())
Run Code Online (Sandbox Code Playgroud)

这样,进一步切片等不会引起新的db调用,并且将保留任何修改.