我有以下型号:
class AppHistory(models.Model):
campaign = models.ForeignKey('campaigns.Campaign')
context_tenant = models.ForeignKey('campaigns.FacebookContextTenant')
start_date = models.DateField()
end_date = models.DateField(blank=True, null=True)
后端是Postgres数据库。对于上面的模型,我需要在插入数据集之前检查以下约束:
start_date
- end_date
)与现有campaign
和context_tenant
campaign
和context_tenant
end_date
为空我知道可以通过执行验证在Django中执行此操作。 但我想确保即使手动插入数据库也会得到验证。
所以目前我想出了两个选项,数据库约束和触发器。我对postgres不太熟悉,所以我不确定约束有多广泛。是否可以仅使用约束来执行上述限制,还是应该使用触发器(甚至是其他东西)?
答案 0 :(得分:0)
当数据无效以回滚事务时,您可以在postgresql和RAISE EXCEPTION中使用trigger 创建触发器时,可以使用自定义迁移在数据库上创建触发器。 with migration.RunPython
答案 1 :(得分:0)
您应该覆盖模型中的save()
方法
def save(self, *args, **kwargs):
<add your conditions here>
return super(AppHistory, self).save(*args,**kwargs)
对于您想要检查应该使用的唯一性的第一个条件,
class Meta:
unique_together = ("campaign", "context_tenant", "start_date")
答案 2 :(得分:0)
我通过使用
这样的约束解决了这个问题EXCLUDE USING gist (campaign WITH =, daterange(start_date, end_date) WITH &&)