Django三级抽象基类继承时Meta的unique_together被忽略如何解决?
结论
这是Django的预期行为。
原因说明
Django的抽象模型类的Meta属性不会被隐式继承:如果子类自己定义了Meta类,父类的Meta配置不会自动同步到子类,必须显式声明继承父类的Meta类才会保留对应配置。
你代码中的Base2自行定义了Meta类仅设置了abstract = True,没有继承Base1的Meta,Base1中定义的unique_together约束在Base2层就已经丢失,最终Concrete类自然无法继承到该约束。
修复方案(符合DRY原则)
直接修改Base2的Meta类,显式继承Base1.Meta即可,无需重复编写已有约束配置:
class Base2(Base1): # ... 其他自定义字段 ... class Meta(Base1.Meta): abstract = True
如果需要在Base2层新增额外的唯一约束,可以直接叠加父类配置,不会覆盖原有逻辑:
class Base2(Base1): # ... 其他自定义字段 ... class Meta(Base1.Meta): abstract = True # 新增额外的唯一组合,不覆盖Base1的配置 unique_together = Base1.Meta.unique_together + [ ('其他字段1', '其他字段2') ]
补充说明:如果你后续升级到Django 2.2及以上版本,更推荐使用Meta.constraints下的UniqueConstraint实现唯一约束,功能更灵活,继承逻辑和上述规则完全一致。
内容的提问来源于stack exchange,提问作者Salvatore Iovene
相关产品推荐
相关产品推荐

