如何修改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
相关产品推荐
相关产品推荐

