我有一个模型(我们称之为实体),它有一个随时间变化的属性(属性),但我想保留该属性在数据库中如何变化的历史记录。我需要能够通过其管理器中 Attribute 的当前值过滤我的实体。但是因为 Django(据我所知)不会让我在一个查询中本地执行此操作,所以我创建了一个数据库视图,它为每个实体生成最新的 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(...)
,所以如果有人知道更简单的方法来获得该功能,那么这样的答案也将被接受!