Django抽象父模型中如何设置唯一的related_name?
我懂你遇到的困扰了——你想让每个继承抽象父模型的子模型都拥有唯一的反向关联名称,但用$(class)s没生效对吧?问题出在占位符的符号用错了,Django里这类动态占位符是用百分号%而不是美元符号$的!
第一步:修正父模型的related_name写法
把你父模型里的$(class)s改成%(class)s,这是Django识别动态类名占位符的正确格式。修正后的父模型代码如下:
class Edit_Lane_Info(models.Model): lane_info = models.OneToOneField( Edit_Lane, related_name='%(class)s', # 这里把$换成% on_delete=models.CASCADE ) def delete(self, *args, **kwargs): super().delete(*args, **kwargs) if self.lane_info: self.lane_info.delete() class Meta: abstract = True
第二步:简化子模型的继承写法
你的子模型不需要同时继承Edit_Lane_Info和models.Model,因为抽象父模型已经继承了models.Model,直接继承父模型即可:
class Status(Edit_Lane_Info): # 这里添加Status模型的字段 pass class Anpr(Edit_Lane_Info): # 这里添加Anpr模型的字段 pass class Sensor_Details(Edit_Lane_Info): # 这里添加Sensor_Details模型的字段 pass
验证效果
修正后,Django会自动为每个子模型生成唯一的反向关联名称:
- 对于
Status模型,Edit_Lane实例可以通过edit_lane.status访问关联的Status对象 - 对于
Anpr模型,Edit_Lane实例可以通过edit_lane.anpr访问关联的Anpr对象 - 对于
Sensor_Details模型,Edit_Lane实例可以通过edit_lane.sensor_details访问关联的Sensor_Details对象
自定义related_name格式(可选)
如果你想给反向关联名加上前缀,比如lane_status、lane_anpr,可以把related_name改成:
related_name='lane_%(class)s'
这样反向关联就会变成edit_lane.lane_status、edit_lane.lane_anpr,进一步避免命名冲突。
内容的提问来源于stack exchange,提问作者Janardhan Reddy. Meeniga
相关产品推荐
相关产品推荐

