Django子类关联父类实例时字段冲突,如何实现该关联?
问题:子类添加指向父类的ForeignKey时字段冲突
我想创建一个子类,让它包含一个指向父类实例的ForeignKey(用于上采样场景),希望在表单里能看到所有父类实例的下拉选项,不管这些实例是否基于其他实例。代码如下:
class ImageResolution(models.Model): image_depth = models.IntegerField(default=3) image_width = models.IntegerField(default=1920) image_height = models.IntegerField(default=1080) class DerivedImageResolution(ImageResolution): base_resolution = models.ForeignKey(ImageResolution, on_delete=models.DO_NOTHING, related_name='base_resolution')
执行后出现报错:
imageapp.DerivedImageResolution.base_resolution: (models.E006) The field 'base_resolution' clashes with the field 'base_resolution' from model 'imageapp.imageresolution'.
请问这个需求能实现吗?如果可以,该怎么操作?
解决方案
可以实现,报错核心原因是字段名与反向关联属性重名:
- 当你给ForeignKey设置
related_name='base_resolution'后,父类ImageResolution会自动生成一个名为base_resolution的反向关联属性 - 子类
DerivedImageResolution继承了父类,因此会继承这个反向关联属性,同时你又在子类里定义了同名的base_resolution字段,两者冲突触发报错。
两种解决方式:
- 修改反向关联名称
把related_name改成和子类字段不重复的名称,既保留反向关联能力,又避免冲突:
class DerivedImageResolution(ImageResolution): base_resolution = models.ForeignKey(ImageResolution, on_delete=models.DO_NOTHING, related_name='derived_resolutions')
- 禁用反向关联
如果不需要从父类实例反向查询子类实例,直接把related_name设为'+',告诉Django不要创建反向关联:
class DerivedImageResolution(ImageResolution): base_resolution = models.ForeignKey(ImageResolution, on_delete=models.DO_NOTHING, related_name='+')
修改完成后,表单会自动加载所有ImageResolution实例(包括DerivedImageResolution子类实例,因为多表继承下子类实例同时属于父类)作为下拉选项,完全满足你的需求。
内容的提问来源于stack exchange,提问作者Tsmith
相关产品推荐
相关产品推荐

