Django模型自关联实现:为Industry模型添加子行业字段
解决Django模型与自身的层级关联问题
嘿,这个需求很常见,就是要构建行业的层级结构嘛~ 既然每个子行业仅能有一个父行业,那确实用ManyToManyField就大材小用了,我们用ForeignKey指向模型自身就完美解决!
修改后的模型代码
class Industry(models.Model): name = models.CharField(max_length=60, unique=True, null=False, blank=False) # 添加父行业关联字段 parent_industry = models.ForeignKey( 'self', on_delete=models.CASCADE, # 可根据业务需求换成PROTECT/SET_NULL等 null=True, blank=True, related_name='sub_industries' ) def __str__(self): return self.name
关键部分解释
to='self':指定这个外键关联到Industry模型本身,实现自关联逻辑null=True, blank=True:顶级行业(没有父行业的行业)需要允许这个字段为空,符合业务场景related_name='sub_industries':这是核心!它让父行业实例可以直接通过sub_industries属性获取所有属于它的子行业,完全匹配你要的功能需求on_delete:这里用了CASCADE,表示如果父行业被删除,所有子行业也会被删除。如果你的业务不允许子行业跟着删除,可以换成PROTECT(阻止删除父行业)或者SET_NULL(把子行业的父行业字段设为null)
使用示例
# 创建顶级行业 tech_industry = Industry.objects.create(name="科技行业") # 创建子行业并关联父行业 software_industry = Industry.objects.create(name="软件行业", parent_industry=tech_industry) hardware_industry = Industry.objects.create(name="硬件行业", parent_industry=tech_industry) # 获取科技行业的所有子行业 tech_industry.sub_industries.all() # 返回<QuerySet [<Industry: 软件行业>, <Industry: 硬件行业>]> # 获取某个子行业的父行业 software_industry.parent_industry # 返回<Industry: 科技行业>
这样既满足了每个子行业只有一个父行业的约束,又能轻松通过父行业获取所有子行业,完全符合你的需求~
内容的提问来源于stack exchange,提问作者Karol
相关产品推荐
相关产品推荐

