Django模型强制/ excatly一个交叉表关系

时间:2017-04-19 07:51:24

标签: python django model

我正在尝试找到有关如何构建代表以下内容的模型的指导:

  • 我们有IT环境(包括多个组件,如网络服务器,数据库等)
  • SLA并非特定于一个环境,它是一组具体环境引用的一般合同(也应该是一个单独的表)
  • 每个环境必须至少有一个或多个SLA关联
  • 从与环境相关联的所有SLA中,必须具有状态"有效"

我实施了一个足以反映前两点的模型(至少,我认为是这样),但特别是最后一点似乎很麻烦。

充分意味着,使用此实现,使用交叉表的关系是可选,而不是必需的。目前这没关系,但从长远来看不行。

<md-select placeholder="country" [(ngModel)]="selectedOption" formControlName="country_id">
    <md-option *ngFor="let country of countries" value="{{country.id}}">{{ country.name }}</md-option>
</md-select>

所以我的问题是:

  • 我通常是在正确的轨道上,但是不能只关注模型而捕捉最后一个约束?

  • 什么是优雅的方式?

1 个答案:

答案 0 :(得分:0)

我们为EnvironmentSLA模型实现了save()方法,该方法执行以下操作:

  1. 检查要保存的对象是否设置状态== EFFECTIVE
    1. 如果不只是保存对象
  2. 尝试获得目前有效的SLA
  3. 将当前有效SLA的状态SLA更改为DEPRECATED
  4. 保存对象
  5. save() - 函数如下所示:

    class EnvironmentSLA(models.Model):
        [...]
        def save(self, *args, **kwargs):
            if self.state != self.EFFECTIVE:
                super(EnvironmentSLA, self).save(*args, **kwargs)
                return
            try:
                effective_sla = EnvironmentSLA.objects.filter(environment=self.environment, state=self.EFFECTIVE).get()
            except Exception as e:
                effective_sla = None
            if effective_sla:
                effective_sla.state = self.DEPRECATED
                effective_sla.save()
            super(EnvironmentSLA, self).save(*args, **kwargs)
    

    这样我们就不会失去定义的SLA,但总是只有一个有效的SLA。