DjangoModelFormMutation保存模型前如何为其关联当前用户
graphene-django 保存模型前自动绑定当前请求用户的实现方式
你可以直接重写DjangoModelFormMutation提供的perform_mutate类方法,实现和Django类视图form_valid完全一致的效果,不需要修改原有表单、模型的定义。
核心逻辑是从GraphQL执行上下文info中拿到Django请求对象,取出当前认证用户赋值给表单绑定的模型实例,再调用父类方法执行保存即可,修改后的Mutation代码如下:
import graphene from graphene_django import DjangoObjectType from graphene_django.forms.mutation import DjangoModelFormMutation class LogType(DjangoObjectType): class Meta: model = Log fields = "__all__" class CreateLogMutation(DjangoModelFormMutation): log = graphene.Field(LogType) class Meta: form_class = LogForm @classmethod def perform_mutate(cls, form, info): # 绑定当前请求用户到Log实例 form.instance.user = info.context.user return super().perform_mutate(form, info)
补充说明
info.context等价于Django类视图中的self.request,除了当前用户外,你也可以从中获取请求头、COOKIE、请求方法等所有请求相关属性。perform_mutate的执行时机是表单校验通过后、数据写入数据库前,此时给form.instance赋值不会被表单的字段逻辑覆盖,和你在form_valid里写的赋值逻辑执行时机完全一致。- 如果接口要求必须登录才能创建日志,可以在赋值前增加登录态校验,避免匿名用户写入导致的外键约束报错:
@classmethod def perform_mutate(cls, form, info): if not info.context.user.is_authenticated: raise ValueError("用户未登录,无法创建日志") form.instance.user = info.context.user return super().perform_mutate(form, info)
内容的提问来源于stack exchange,提问作者Tintin
相关产品推荐
相关产品推荐

