2012-03-15 9 views
5

ビューでこれを行うことはできますか?Djangoで即座にQuerySetオブジェクトを変更する

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

それはチャンピオンのように働いたが、私はどこか別の同じようなことを試してみましたが、私は、クエリセットオブジェクトがで翻弄するのは好きではないことを示唆している、奇妙な結果を得ていました。そして、私はこの種のトリックのためにドキュメントの中に何かが良いか悪いか分からなかった。

私はこれを行うには他の方法があると知っていますが、私は特にこれが悪い考えであるのか、悪いのか、本当に悪いのかを知りたいと思っています。その場で値を変更することができます。

答えて

6

後で何もしないと、クエリーセットが再評価されます(たとえば、スライスするなど)。それはデータベースに別のクエリを作成し、すべての変更されたオブジェクトは新しいオブジェクトに置き換えられます。その身を守るために

の方法は、最初のリストに変換するには、次のようになります。

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

この方法は、さらにスライスなどは、新鮮なデシベルコールを引き起こすことはありませんし、任意の変更が保存されます。

+0

ありがとう、ダニエル。あなたの例はまさに私が「これを行う他の方法があることを知っている」と言ったときの意味であり、私はあなたの明確化にも感謝しています。ああ、スライスを取ったあなたの例は、まさに私が言及した奇妙な結果を引き起こしていたものです。私は少し恥ずかしいです、私はそれをキャッチしていない、と私はあなたがそれを指摘してうれしいです。乾杯! – proffrink

0

ドキュメントhere

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

私はDjangoのイディオムとなるだろうを参照してください。これは、あなたのコードのように複数のSQL文を送る代わりに、 'where'と 'update'という単一の文でSQLを実行します。これにより時間が節約されます。 Djangoの'connection'でSQL時刻を調べてください。

+4

ご迷惑をおかけして申し訳ございませんが、データベースを更新することに興味はありませんが、表示目的で出力を変更するだけです。 – proffrink

関連する問題