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

如何修改Django MultipleChoiceField实现多表关联展示指定值

实现Django多表关联生成自定义MultipleChoiceField

1. 确认模型关联关系

先确保你的Django模型正确建立外键关联,对应给出的表结构:

from django.db import models

class Province(models.Model):
    name_en = models.CharField(max_length=100)
    name_ta = models.CharField(max_length=100, blank=True)

class District(models.Model):
    province = models.ForeignKey(Province, on_delete=models.CASCADE)
    name_en = models.CharField(max_length=100)
    name_ta = models.CharField(max_length=100, blank=True)

class City(models.Model):
    district = models.ForeignKey(District, on_delete=models.CASCADE)
    name_en = models.CharField(max_length=100)
    name_ta = models.CharField(max_length=100, blank=True)

2. 生成自定义选项列表

通过两种方式可生成符合要求的选项,以城市ID为值,省、区、市的name_en拼接为标签:

方式一:ORM注解(高效推荐)

直接在数据库层面完成字段拼接,避免额外内存开销:

from django.db.models import CharField, Value
from django.db.models.functions import Concat

def get_city_choices():
    cities = City.objects.select_related('district__province').annotate(
        full_name=Concat(
            'district__province__name_en',
            Value(','),
            'district__name_en',
            Value(','),
            'name_en',
            output_field=CharField()
        )
    ).values_list('id', 'full_name')
    return list(cities)

方式二:Python循环拼接(灵活可控)

适合需要额外逻辑处理的场景,同时通过select_related避免N+1查询:

def get_city_choices():
    choices = []
    cities = City.objects.select_related('district__province')
    for city in cities:
        full_name = f"{city.district.province.name_en},{city.district.name_en},{city.name_en}"
        choices.append((city.id, full_name))
    return choices

3. 在表单中应用

在表单类中调用上述方法生成选项:

from django import forms

class CitySelectForm(forms.Form):
    city = forms.MultipleChoiceField(
        choices=get_city_choices(),
        widget=forms.SelectMultiple()  # 单选需求可替换为forms.Select()
    )

内容的提问来源于stack exchange,提问作者Niluminda Dissanayake

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:25:22