在Django中动态更改QuerySet对象

时间:2012-03-15 01:45:20

标签: django django-views

我可以或者应该在视图中执行此操作吗?

a = SomeTable.objects.all()
for r in a:
    if r.some_column == 'foo':
        r.some_column = 'bar'

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

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

2 个答案:

答案 0 :(得分:6)

只要您以后不执行任何会导致重新评估查询集的内容(例如,对其进行切片),这很好。这将对数据库进行另一次查询,并且所有修改过的对象将被替换为新的对象。

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

a = list(SomeTable.objects.all())

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

答案 1 :(得分:0)

烨。请参阅文档here

SomeTable.objects.filter(some_column='foo').update(some_column='bar')

我会选择Django的习语。它使用带有'where'和'update'的单个语句执行SQL,而不是像代码那样发送多个SQL语句。这节省了时间。检查Django的'connection'以测试SQL时间。