Django POST方法中如何获取并保存模型外键字段值?
你遇到的报错翻译为:值错误:无法赋值"'1'":"Event.patient"必须是一个"Patient"实例对象
核心原因
Django的外键字段默认要求传入对应关联模型的实例对象,而你从request.POST中获取的patient、doctor都是字符串格式的主键ID,直接赋值给外键字段就会触发上述错误。
解决方案
你可以选择以下任意一种方式修改代码:
方案1:查询获取实例后赋值
根据拿到的ID先查询对应的Patient和User实例,再赋值给外键字段:
def registerBooking(request): if request.method == 'POST': form = BookingForm(request.POST) place = request.POST.get('place','') visit_type = request.POST.get('visit_type','') description = request.POST.get('description','') patient_id = request.POST.get('patient','') # 修改变量名避免和实例混淆 doctor_id = request.POST.get('doctor','') # 修改变量名避免和实例混淆 created_at = request.POST.get('created_at','') if form.is_valid(): new_booking = form.save() # 查询对应实例 patient_obj = Patient.objects.get(id=patient_id) doctor_obj = User.objects.get(id=doctor_id) new_event = Event( title=visit_type, description=description, start_time=created_at, place=place, patient=patient_obj, doctor=doctor_obj ) new_event.save() return JsonResponse({"msg":"Booking and Event successfully saved."}) else: return JsonResponse({"msg":"Invalid data"}) else: form = BookingForm() return render(request, 'patient/register_booking.html', {'form':form})
如果业务逻辑允许patient/doctor为空,可以把get()换成filter(id=xxx).first(),避免ID不存在时抛出异常。
方案2:直接赋值外键主键属性
Django会自动为每个外键字段生成{外键名}_id属性,可直接传入主键值,不需要额外查询实例,性能更优:
if form.is_valid(): new_booking = form.save() new_event = Event( title=visit_type, description=description, start_time=created_at, place=place, # 直接用外键_id属性赋值主键值 patient_id=patient, doctor_id=doctor ) new_event.save() return JsonResponse({"msg":"Booking and Event successfully saved."})
内容的提问来源于stack exchange,提问作者Akram Baklouti
相关产品推荐
相关产品推荐

