同一Model内关联实现?Company模型总部与branch_offices关联方案咨询
公司总部与分支机构的模型关联实现方案
我有一个Company模型,其中包含总部(headquarters)和分支机构(branch_offices)两类数据,二者属性完全一致且不会发生变更。总部可以关联多个分支机构(关联为可选),而分支机构必须归属于某一个总部。我希望API能按照以下格式返回关联数据(无关字段已移除):
"data": { "id": "607424", "type": "companies", "attributes": { "commerce_register_data": { "uid": "US462745827168", "name": "Big Company Ltd" }, "branch_offices": [ { "uid": "US4852847292", "name": "Big Company Ltd, branch_office Chicago", "status": "ACTIVE", "legal_form": { "id": 9, "name": { "en": "Branch" }, "short_name": { "en": "Bran" } } } ] } }
我调研后想到的几种思路:
- 思路1:拆分两个独立模型(Headquarter和Branch_office)
- 无额外收益,反而大幅增加代码复杂度,不推荐。
- 思路2:按名称模式匹配关联
- 通过名称中的“branch_office City”这类模式查询关联,性能低下且容易出现匹配错误,不可靠。
- 思路3:新增Branch中间模型
- 新增包含公司外键的Branch模型来维护关联,设计过于复杂,增加不必要的层级。
- 思路4:同一模型内建立自关联
- 调研显示该方案可行,但我从未实际使用过。
- 思路5:在Company模型中添加headquarter_id字段
- 为分支机构记录所属总部的ID,直接通过字段关联。
推荐方案:同一模型内自关联(结合思路4和5)
在Company模型中添加headquarter_id字段(可为空):
- 总部的
headquarter_id设为null,标识其为总部节点; - 分支机构的
headquarter_id设置为对应总部的ID,建立归属关系。
这种方式的优势:
- 无需新增模型,保持代码简洁,避免冗余;
- 关联关系清晰,查询性能高,直接通过字段过滤即可获取总部的所有分支机构;
- 完全适配你需要的API输出格式:查询总部数据时,可通过
headquarter_id关联查询出所有下属分支机构,嵌套返回在branch_offices字段中。
以Django ORM为例的实现代码:
from django.db import models class Company(models.Model): # 原有属性字段示例 commerce_register_data = models.JSONField() status = models.CharField(max_length=20) legal_form = models.JSONField() # 自关联字段 headquarter = models.ForeignKey( 'self', on_delete=models.CASCADE, related_name='branch_offices', null=True, blank=True )
序列化API响应时,可通过headquarter.branch_offices直接获取所有分支机构,嵌套到响应的branch_offices数组中,完全符合预期输出格式。
内容的提问来源于stack exchange,提问作者abc05
相关产品推荐
相关产品推荐

