Django与Postgres和先进的约束

时间:2018-06-18 10:05:54

标签: django postgresql constraints

我有以下型号:

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)与现有campaigncontext_tenant
  • 如果没有相同的campaigncontext_tenant end_date为空
  • ,则只能插入行

我知道可以通过执行验证在Django中执行此操作。 但我想确保即使手动插入数据库也会得到验证。

所以目前我想出了两个选项,数据库约束和触发器。我对postgres不太熟悉,所以我不确定约束有多广泛。是否可以仅使用约束来执行上述限制,还是应该使用触发器(甚至是其他东西)?

3 个答案:

答案 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 &&)