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

Django Graphene GraphQL mutation调用400错误 外键字段返回null

问题原因

两个独立问题共同导致报错:

  • 后端返回值类型不匹配:CreateVideoConsultation的返回字段appointment_booking定义为graphene.Int()类型,但mutate方法返回时传入的是查询得到的Appointment_Booking模型实例,而非整数ID。Graphene尝试将模型实例强制转换为整数时触发类型错误,因此响应中该字段为null。由于数据库保存操作在返回逻辑之前执行,因此Django后台能看到成功创建的数据。另外client、veterinarian字段定义为字符串类型,实际返回的是对应模型实例,依赖模型__str__方法做隐式转换,存在同类隐患。
  • 前端传参名不匹配:前端GQL语句中定义的入参名为驼峰格式appointmentBooking,但调用useMutation传参时写的是下划线格式appointment_booking,导致参数无法正确映射到接口,触发400请求错误。
修复步骤

后端修改

调整mutate方法的返回值,保证传入的字段值和定义的类型一致:

def mutate(self, info, client, veterinarian, appointment_booking):
    client_obj = Client.objects.get(username = client)
    veterinarian_obj = Veterinarian.objects.get(username = veterinarian)
    appointment_obj = Appointment_Booking.objects.get(id = appointment_booking)
    video_consultation = Video_Consultation(
        client = client_obj, 
        veterinarian = veterinarian_obj, 
        appointment_booking = appointment_obj
    )
    video_consultation.save()

    return CreateVideoConsultation(
        id = video_consultation.id,
        client = client_obj.username, # 显式取用户名字符串,匹配String类型
        veterinarian = veterinarian_obj.username,
        appointment_booking = appointment_obj.id # 显式取ID整数值,匹配Int类型
    )

如果需要返回关联对象的完整信息而非单个字段,可以将对应返回字段替换为对应模型的DjangoObjectType类型,无需使用基础Int/String类型定义。

前端修改

调整传参的变量名,和GQL语句中定义的驼峰命名保持一致:

CreateVideoConsultation({
    variables:{
        client: sched.appointmentBooking.client.username,
        veterinarian: sched.appointmentBooking.veterinarian.username,
        appointmentBooking: parseInt(sched.appointmentBooking.id) // 修正参数名,去掉下划线
    }
})

注:Graphene默认开启蛇形命名转驼峰规则,Schema中定义的下划线命名字段,前端调用时统一使用驼峰格式即可。

修改完成后重新测试,接口将正常返回appointmentBooking字段值,前端400错误也会消失。

内容的提问来源于stack exchange,提问作者Jericho Repani Tumbagahan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:27:46