如何在Django中创建包含嵌套关联对象的Model模型
Django 生产订单条目功能实现方案
方案1:关系型数据库标准实现(生产环境推荐)
这是符合数据库设计规范的实现方式,通过中间模型存储多对多关联的额外字段(数量),保证数据一致性和查询灵活性。
完整模型代码
from django.db import models class Product(models.Model): name = models.CharField(max_length=100, blank=True, default='') def __str__(self): return self.name # 新增中间表模型,存储生产单与产品的关联关系+数量 class ProductionOrderEntry(models.Model): production_order = models.ForeignKey('ProductionOrder', on_delete=models.CASCADE, related_name='entries') product = models.ForeignKey(Product, on_delete=models.PROTECT) # 防止已关联生产单的产品被误删 quantity = models.PositiveIntegerField(default=1) # 存储产品数量,仅支持正整数 class ProductionOrder(models.Model): created = models.DateTimeField(auto_now_add=True) # 可选:显式声明多对多字段方便反向查询 products = models.ManyToManyField(Product, through=ProductionOrderEntry, related_name='production_orders')
生成目标数据结构示例
def get_production_order_info(order_id): order = ProductionOrder.objects.get(id=order_id) return { 'id': order.id, 'entries': [ {'product': entry.product.name, 'quantity': entry.quantity} for entry in order.entries.all() ] }
方案优势
- 遵循数据库范式,支持外键约束,不会出现无效的产品引用
- 支持对单个条目做数据库级的查询、过滤、统计,比如统计某产品所有生产单的总数量非常便捷
方案2:JSON字段快速实现(仅推荐原型开发使用)
如果是小型项目、不需要对条目做复杂查询,可以用JSON字段直接存储字典列表,开发成本更低但数据一致性风险更高。
完整模型代码
from django.db import models class Product(models.Model): name = models.CharField(max_length=100, blank=True, default='') class ProductionOrder(models.Model): created = models.DateTimeField(auto_now_add=True) entries = models.JSONField(default=list) # 直接存储条目字典列表
写入数据示例
product1 = Product.objects.create(name='product_1_ref') product2 = Product.objects.create(name='product_2_ref') order = ProductionOrder.objects.create( entries=[ {'product': product1.name, 'quantity': 10}, {'product': product2.name, 'quantity': 10} ] )
方案劣势
- 没有外键约束,产品删除后JSON内的引用不会自动更新,容易产生脏数据
- 无法直接对entries内的产品、数量做数据库级的过滤统计,大数据量下查询效率极低
内容的提问来源于stack exchange,提问作者maikelinhas
相关产品推荐
相关产品推荐

