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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:42:29