0

私はこのようなモデルを持っています:

class M(models.Model):
    ...
    seen = models.BooleanField()
    ...

    def set_seen(self):
        self.seen = True
        self.save()

次に、views.py 関数に次のコードを含めます。

m_not_seen = M.objects.filter(seen=False)
m_seen = M.objects.filter(seen=True)

for m in m_not_seen:
    m.set_seen()

最後の行が実行された後、 m_seen が自動的に更新され、以前は「見られなかった」にあったすべてのエントリが含まれているようです。クエリセットを更新したくありません。これは可能ですか?

4

1 に答える 1

4

ドキュメントにあるように、Django クエリセットは遅延型です。

内部的には、QuerySet は、実際にデータベースにアクセスすることなく、構築、フィルター処理、スライス、および一般的に渡すことができます。クエリセットを評価するために何かを行うまで、データベース アクティビティは実際には発生しません。

m_seen = M.objects.filter(seen=True)あなたの場合、ループを開始するか、データベースで何をするかが決まるまで、書き込みはデータベースに行きません。その時点で、見られないものはすでに見られるように更新されています。

ドキュメントでは、ピクルス化や、QuerySet を強制的に評価するその他の方法について説明しています。あなたの場合、おそらくlist()QuerySet を呼び出したいだけですが、これによりすべての結果がメモリにロードされることに注意してください。

于 2013-06-05T14:11:23.743 に答える