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

Django中ModelChoiceField如何正确显示查询集的纯名称选项

解决Django ModelChoiceField显示冗余格式的问题

你的问题出在ModelChoiceField的queryset使用错误,以及未正确控制选项的显示逻辑。以下是两种可行的解决方法:

方法一:规范使用ModelChoiceField(推荐)

ModelChoiceField需要接收模型实例的QuerySet,它会通过模型的__str__方法生成选项显示文本。

  1. 修改模型,添加__str__方法
    在BdimMaestraDatos模型中添加__str__方法,指定显示nombre字段:
class BdimMaestraDatos(models.Model):
    nombre = models.CharField(db_column='NOMBRE', max_length=32, blank=True, null=True)
    # 其他原有字段...

    def __str__(self):
        # 处理nombre为null的情况,避免显示空值
        return self.nombre or ""

    class Meta:
        managed = False
        db_table = 'BDIM_MAESTRA_DATOS'
  1. 调整表单的queryset为模型实例集合
    去掉values_list,直接获取过滤后的模型实例,同时用distinct('nombre')去重(PostgreSQL支持按字段去重):
from django import forms
from .models import BdimMaestraDatos

# 获取活跃用户的模型实例,按nombre去重
lista_queryset_nombres_activos = BdimMaestraDatos.objects.filter(fecha_baja__isnull=True).distinct('nombre')

class MaestraDatosForm(forms.Form):
    Seleccionar_Nombre = forms.ModelChoiceField(label="Nombre", queryset=lista_queryset_nombres_activos)

方法二:改用ChoiceField自定义选项

如果不想修改模型,可以用ChoiceField代替ModelChoiceField,手动生成选项列表:

  1. 调整查询集,使用flat=True获取纯字符串列表
    给values_list添加flat=True参数,返回一维字符串列表而非元组:
lista_queryset_nombres_activos = BdimMaestraDatos.objects.filter(fecha_baja__isnull=True).values_list('nombre', flat=True).distinct()
  1. 生成ChoiceField的选项
    将字符串列表转成(值, 显示文本)的格式,同时过滤空值:
from django import forms
from .models import BdimMaestraDatos

lista_queryset_nombres_activos = BdimMaestraDatos.objects.filter(fecha_baja__isnull=True).values_list('nombre', flat=True).distinct()
# 生成选项,过滤掉null/空字符串的情况
nombre_choices = [(name, name) for name in lista_queryset_nombres_activos if name]

class MaestraDatosForm(forms.Form):
    Seleccionar_Nombre = forms.ChoiceField(label="Nombre", choices=nombre_choices)

问题原因说明

你之前用values_list('nombre')返回的是元组列表[('PEDRO',), ('JUAN',), ...],而ModelChoiceField会把传入的每个元素(这里是元组)直接转成字符串显示,所以才会出现('PEDRO',)这种冗余格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 14:23:10