如何在多对一关系的一方强制执行参照完整性?

时间:2016-02-27 21:58:30

标签: django django-models

这些是我的模特:

class Hero(models.Model):
    name = models.CharField(max_length=24)

class Photo(models.Model):
    hero = models.ForeignKey(Hero)
    image = models.ImageField(upload_to='heroes')

现在,根据此应用的规则,如果没有至少一个Hero,则不得创建Photo。我花了4个小时梳理文档,而我还没有找到解决方案。如果这是Rails,那很简单:

class Hero < ActiveRecord::Base
  has_many :photos, dependent: :destroy

class Photo < ActiveRecord::Base
  belongs_to :hero

使用我的Django模型,这些字段可确保Photo无法上传Hero - 这就是我想要的 - 但可以创建Hero没有Photo - 这不是我想要的,我想在数据库级强制执行Hero至少有一个Photo

我如何实现这一目标?

1 个答案:

答案 0 :(得分:4)

绝对没有办法在数据库级别执行此操作,并且您的Rails代码当然没有这样做。这不是Django或Rails的限制,而是简单的逻辑;没有英雄的身份证无法创建照片,这意味着必须先创建英雄 - 没有照片 - 首先。

在任何应用程序中执行此操作的唯一方法是在创建Heros和Photos时的业务逻辑中。在Django中,您可以通过表单执行此操作 - Hero的模型表单以及Photo的相关内联表单集。然后,模型表单的验证逻辑将负责确保至少创建一个Photo。