時間の経過とともに変化する属性 (属性) を持つモデル (エンティティと呼びましょう) がありますが、その属性がデータベースでどのように変化するかの履歴を保持したいと考えています。マネージャーの属性の現在の値でエンティティをフィルター処理できる必要があります。しかし、Django (私が知る限り) ではネイティブに 1 つのクエリでこれを行うことはできないため、すべてのエンティティの Attribute の最新の値を生成するデータベース ビューを作成しました。したがって、私のモデル構造は次のようになります。
class Entity(models.Model):
def set_attribute(self, value):
self.attribute_history.create(value=value)
def is_attribute_positive(self, value):
return self.attribute.value > 0
class AttributeEntry(models.Model):
entity = models.ForeignKey(Entity, related_name='attribute_history')
value = models.IntegerField()
time = models.DateTimeField(auto_now_add=True)
class AttributeView(models.Model)
id = models.IntegerField(primary_key=True, db_column='id',
on_delete=models.DO_NOTHING)
entity = models.OneToOneField(Entity, related_name='attribute')
value = models.IntegerField()
time = models.DateTimeField()
class Meta:
managed = False
私のデータベースには、次のような SQL で作成された現在の属性を生成するビューがあります。
CREATE VIEW myapp_attributeview AS
SELECT h1.*
FROM myapp_attributehistory h1
LEFT OUTER JOIN myapp_attributehistory h2
ON h1.entity_id = h2.entity_id
AND (h1.time < h2.time
OR h1.time = h2.time
AND h1.id < h2.id)
WHERE h2.id IS NULL;
私の問題は、set_attribute()
チェックを使用してモデル オブジェクトに属性を設定するis_attribute_positive()
と、Django が関連する AttributeView オブジェクトをキャッシュしている可能性があるため、常に機能するとは限らないことです。少なくともビューを再クエリすることで、Django にモデルを更新させるにはどうすればよいですか? attribute
どういうわけかプロパティをダーティとしてマークできますか?
PS:私がこれを行っている理由は、のようなことができるようEntity.objects.filter(attribute__value__exact=...).filter(...)
にするためです。そのため、誰かがその機能を取得する簡単な方法を知っていれば、そのような答えも受け入れられます!