7

SQL データベース上に Django モデル TestModel があります。

私がするたびに

TestModel.objects.all()

同じプロセスから複数回実行すると、同じ結果が得られるようです。モデルが構築されているテーブルから行を手動で (django プリミティブを使用せずに) 削除することで、クエリは同じ結果を返すことをテストしましたが、削除後のオブジェクトは明らかに少ないはずです。

ある種のキャッシュメカニズムがあり、オブジェクトを取得するたびにdjangoがデータベースにアクセスするわけではありませんか?

ある場合、できれば生のSQLクエリを書かずに、各クエリでdjangoを強制的にデータベースにアクセスさせる方法はありますか?

また、プロセスを再起動すると、モデルが再び正しいオブジェクトを返すことを指定する必要があります。削除されたオブジェクトは表示されなくなりますが、さらに削除すると、問題が再び発生します。

4

2 に答える 2

1

これは、データベースの分離レベルが繰り返し読み取り可能であるためです。djangoシェルでは、すべてのリクエストが1つのトランザクションに含まれます。

編集済み

シェルで試すことができます:

from django.db import transaction
with transaction.autocommit():
    t = TestModel.objects.all()
    ...
于 2012-12-07T17:12:53.823 に答える
-1

db トランザクションの問題のようです。データベース自体に個別にアクセスしてデータを変更している間、シェル セッションを開いたままにしておくと、分離されているため、シェルで開いているトランザクションは変更を認識しません。新しいトランザクションを表示するには、シェルを終了してリロードする必要があります。

本番環境では、トランザクションはリクエスト/レスポンス サイクルに関連付けられているため、これは大きな問題にはなりません。

于 2012-12-07T17:17:36.723 に答える