3

私は次のものを持っていますmodels.py

class BagOfApples(models.Model):
    quantity = models.PositiveSmallIntegerField(default = 0)

「りんごの袋」オブジェクトを作成し、その中に「りんご」を入れましょう。

>>> from myapp import models
>>> 
>>> models.BagOfApples().save()
>>> 
>>> bag1 = models.BagOfApples.objects.get(pk = 1)
>>> bag2 = models.BagOfApples.objects.get(pk = 1)
>>> 
>>> bag1.quantity += 1
>>> bag1.save()
>>> 
>>> bag1.quantity
1
>>> bag2.quantity
0

bag2変数にデータを自動的にリロードする方法はありますか?

私の実際のアプリケーションでは、物事はそれよりも少し複雑で、同じオブジェクトが別のデータベース クエリによって取得された後、コードの別の部分で変更される可能性があります。これは意図的なものではありません (たとえば、Django が OneToOne または ForeignKey 関係の結果をキャッシュするため、この問題が発生します)。

同一のオブジェクトを追跡するある種のマネージャー (おそらくミドルウェアがこれを行うことができますか?) を持つことは本当に役に立ちます。

この例では、マネージャーはbag2が実際bag1には であることを自動的に検出し、2 番目のクエリを実行せずに単に を返しbag1ます。

これを行う良い方法がない場合は、より良いアプリケーション設計に関するその他の役立つヒントをいただければ幸いです。

4

1 に答える 1

0

重要なのは、クエリが実際にいつ実行されるかを理解することです。モデル オブジェクトは、そのモデル フィールドの 1 つにアクセスするたびにクエリを繰り返すわけではありません。

古いデータを持つオブジェクトを保持しないようにするために、実際にデータが必要なときにクエリを実行するようにします。あなたの例では、変更されないことがわかっている情報 (pk 値) を保持し、新しい値を持つオブジェクトが必要なときに get を実行します。

from myapp import models
models.BagOfApples().save()

bag1 = models.BagOfApples.objects.get(pk = 1)

bag1.quantity += 1
bag1.save()

print bag1.quantity  # will print 1

bag2 = models.BagOfApples.objects.get(pk = 1)
print bag2.quantity  # will print 1 too
于 2013-08-20T17:28:09.053 に答える