Django模型多字段关联同表同字段的多对一映射实现咨询
错误原因分析
你之前的写法无法运行的核心问题有两个:
- 同一张数据库表不允许存在同名字段,你为两个不同的模型字段指定了相同的
db_column属性,相当于要求数据库在OrderItem_Mon对应表中创建多个重名字段,直接违反数据库基本规则。 - 当同一模型中多个外键指向同一个关联模型时,必须显式指定
related_name参数,避免Django生成反向关联关系时出现命名冲突。
正确实现代码
模型定义
class OrderItem_Mon(models.Model): vendor_name_1 = models.ForeignKey( Vendor, on_delete=models.SET_NULL, null=True, related_name="order_items_vendor1", db_column="vendor_name_1", verbose_name="供应商1" ) vendor_name_2 = models.ForeignKey( Vendor, on_delete=models.SET_NULL, null=True, related_name="order_items_vendor2", db_column="vendor_name_2", verbose_name="供应商2" ) menu_name_1 = models.ForeignKey( Menu, on_delete=models.SET_NULL, null=True, related_name="order_items_menu1", db_column="menu_name_1", verbose_name="菜品1" ) menu_name_2 = models.ForeignKey( Menu, on_delete=models.SET_NULL, null=True, related_name="order_items_menu2", db_column="menu_name_2", verbose_name="菜品2" ) date_created = models.DateTimeField('创建时间', auto_now_add=True) note = models.CharField('备注', max_length=255, null=True, blank=True)
表单实现
Django的ModelForm会自动将ForeignKey字段渲染为下拉选择框,选项默认取自关联模型的全部数据,刚好匹配你的需求,示例代码如下:
from django import forms from .models import OrderItem_Mon class OrderItemMonForm(forms.ModelForm): class Meta: model = OrderItem_Mon fields = ["vendor_name_1", "vendor_name_2", "menu_name_1", "menu_name_2", "note"]
如果需要过滤下拉框的可选选项,可在表单中通过queryset参数自定义:
class OrderItemMonForm(forms.ModelForm): # 示例:只展示状态为启用的供应商 vendor_name_1 = forms.ModelChoiceField(queryset=Vendor.objects.filter(status=1)) class Meta: model = OrderItem_Mon fields = ["vendor_name_1", "vendor_name_2", "menu_name_1", "menu_name_2", "note"]
内容的提问来源于stack exchange,提问作者D C
相关产品推荐
相关产品推荐

