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
相关产品推荐
相关产品推荐

