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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:45:03