You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:37:37