Django CreateView新增Consult时外键Patient为null报错解决方法
问题描述
- 报错现象:插入
Consult表失败,失败记录内容为(6, 2022-06-18 09:50:32.722841+00, 2022-06-18 00:00:00+00, NE, something, something, null) - 模型关系:共定义3个模型,
Patient与Hospitalization、Consult为一对多关系,后两个模型通过ForeignKey字段关联Patient - 问题定位:报错记录末尾的null位置本应存储关联的
Patient主键ID,但不清楚如何正确获取并传入该值 - 现有逻辑判断:需要在视图层补充关联赋值逻辑,但不知道具体实现方式
Models.py 代码如下:
class Patient(models.Model): NameandLastName = models.CharField(max_length = 50) ... # 注意:贴出的代码里类定义行末尾缺了冒号,实际运行需要补上 class Consult(models.Model): Patient = models.ForeignKey(Patient, on_delete = models.CASCADE) simptoms = models.CharField(max_length = 50) option_pay = models.CharField(max_length = 40, choices = pay_method) ...
Views.py 代码如下:
class Consult(LoginRequiredMixin, CreateView): model = Consult template_name = 'Manage/ConsultAdd.html' form_class = forms.FromConsultAdd def form_valid(self, form): form.instance.autor = self.request.user messages.success(self.request, f"smth") return super().form_valid(form)
解决方法
报错核心原因是Consult模型的Patient外键为必填字段,当前视图逻辑仅给autor字段赋了值,未处理Patient字段,保存时该字段为空触发数据库非空约束报错。根据获取Patient的场景不同,对应实现如下:
场景1:患者ID来自URL路径参数
这是医疗管理系统最常用的实现:先进入某个具体患者的详情页,再点击按钮跳转为该患者添加问诊记录,路由一般配置为/patient/<int:patient_pk>/consult/add/格式,直接在form_valid中从URL参数取值赋值即可:
def form_valid(self, form): form.instance.autor = self.request.user # 取URL里的患者ID参数,patient_pk替换成你路由里配置的对应参数名 form.instance.Patient_id = self.kwargs["patient_pk"] messages.success(self.request, "问诊记录添加成功") return super().form_valid(form)
说明:Django的外键字段默认会在数据库生成字段名_id的列,直接给Patient_id赋主键值不需要提前查询Patient实例,能减少一次数据库查询
场景2:当前登录用户即为对应患者
如果系统是患者本人登录提交问诊记录,且Patient模型和Django内置User模型做了一对一关联,直接从请求的用户对象取关联的患者实例赋值即可:
def form_valid(self, form): form.instance.autor = self.request.user # 这里的user为Patient模型关联User的一对一字段名,根据实际字段名调整 form.instance.Patient = self.request.user.patient messages.success(self.request, "问诊记录添加成功") return super().form_valid(form)
前置检查项
- 确认表单类
FromConsultAdd的fields配置中,要么包含Patient字段(由前端传值),要么把该字段加入exclude列表由视图层手动赋值,否则会出现字段校验不通过的问题 - 如果是前端表单提交患者ID,要确认前端传的参数名和字段名一致,且传入的ID对应数据库中存在的Patient记录
内容的提问来源于stack exchange,提问作者codeC
相关产品推荐
相关产品推荐

