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

Django:如何在ModelForm的ModelChoiceField实现显用户名存医生ID

解决方案

问题核心是你误用了User模型的queryset并使用values()返回了字典集合,而ModelChoiceField需要接收模型实例的queryset。同时,你的需求是最终提交doctor表的ID,所以应该直接基于Doctor模型构建字段,通过自定义标签显示关联的User用户名即可。

修改后的代码

from django import forms
from .models import patient, doctor, hospitalAdmin
from django.contrib.auth.models import User

class PatientForm(forms.ModelForm):
    # 直接关联Doctor模型,因为最终要存储的是doctor的ID
    assigned_doctor = forms.ModelChoiceField(
        queryset=None,
        empty_label="Name of the Doctors",
        # 不需要to_field_name,默认提交doctor的pk(id)
    )

    class Meta:
        model = patient
        fields = ['patient_first_name', 'patient_last_name', 'address', 'mobile', 'age', 'symptoms']

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop("request")
        super().__init__(*args, **kwargs)
        
        # 优化admin实例获取,避免索引越界错误
        admin = hospitalAdmin.objects.filter(user_id=self.request.user.id).first()
        if admin:
            # 直接获取当前admin下属的有效医生(关联User状态为True)
            doctors_queryset = doctor.objects.filter(
                assigned_hospitalAdmin=admin.pk,
                user__status=True  # 通过外键直接过滤User状态
            )
            # 给字段赋值合法的模型实例queryset
            self.fields['assigned_doctor'].queryset = doctors_queryset
            
            # 自定义下拉选项显示文本为关联User的username
            self.fields['assigned_doctor'].label_from_instance = lambda obj: obj.user.username

关键说明

  1. 字段模型关联调整:assigned_doctor直接绑定Doctor模型,匹配patient表的doctor_assignid外键,表单提交时自动传递Doctor的ID,无需额外转换。
  2. 简化查询逻辑:通过外键关联直接过滤,避免手动拼接ID列表的冗余操作,查询效率更高。
  3. 自定义显示文本:利用label_from_instance方法,让下拉选项展示医生对应的User用户名,同时提交的是Doctor的ID,完全符合需求。
  4. 容错处理:用first()获取admin实例,避免原代码中adminId[0]['pk']可能出现的索引越界问题(当admin不存在时)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:12:30