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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:36:04