这些是我的模特:
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
。
我如何实现这一目标?
答案 0 :(得分:4)
绝对没有办法在数据库级别执行此操作,并且您的Rails代码当然没有这样做。这不是Django或Rails的限制,而是简单的逻辑;没有英雄的身份证无法创建照片,这意味着必须先创建英雄 - 没有照片 - 首先。
在任何应用程序中执行此操作的唯一方法是在创建Heros和Photos时的业务逻辑中。在Django中,您可以通过表单执行此操作 - Hero的模型表单以及Photo的相关内联表单集。然后,模型表单的验证逻辑将负责确保至少创建一个Photo。