2012-03-15 103 views
5

我可以或应该在视图中执行此操作吗?在Django中动态更改QuerySet对象

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

它像一个冠军,但我想类似的事情别的地方,我得到了奇怪的结果,这意味着QuerySet的对象不喜欢惹的。而且,我没有看到文档中的任何内容对于这种技巧的好坏。

我知道还有其他的方法可以做到这一点,但我特别想知道这是一个坏主意,为什么它不好,如果它确实很糟糕,那么'最好'的最Django/pythonic方式在飞行中改变价值将是。

回答

6

这很好,只要你以后不做任何事情会导致查询集重新评估 - 例如,切片。这将对数据库进行另一次查询,并且所有修改的对象都将被新的数据库替换。

保护自己免受这将是转换到一个列表第一种方法:

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

通过这种方式,进一步切片等不会造成新的数据库调用,任何修改将被保留。

+0

谢谢Daniel。当我说“我知道还有其他方法可以做到这一点”时,您的示例正是我的意思,我也很感谢您的澄清。哦,你的分片例子正是我提到的奇怪结果。我有点尴尬,我没有听清楚,我很高兴你指出了这一点。干杯! – proffrink 2012-03-15 11:56:31

0

是。看文档here

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

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

+4

谢谢,我很抱歉,如果我不清楚,但我不想更新数据库,只是修改输出的显示目的。 – proffrink 2012-03-15 11:54:23