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

使用Django Auth User类与Graphene开发时遇AttributeError报错求助

解决Graphene-Django使用Django默认User模型时的AttributeError问题

嘿,这个问题我之前踩过坑!核心原因其实很直白——Django自带的User模型压根没有name字段,而你之前用的自定义User类应该是自己添加了name字段,所以切换到默认User后,Graphene自动生成类型时找不到这个属性,直接抛出了AttributeError。

为什么会这样?

Django默认的User模型是用first_name和last_name两个字段来存储用户姓名的,没有统一的name字段。当你用DjangoObjectType关联默认User时,Graphene会自动映射模型里的现有字段,但如果你的GraphQL查询或Schema里还在请求name字段,就会触发这个找不到属性的错误。

给你几个可行的解决方案:

1. 直接修改GraphQL查询,适配默认User字段

如果不想改代码,最简单的方式就是把查询里的name换成firstName和lastName(Graphene会自动把模型的下划线字段转成驼峰格式)。比如之前的查询:

{
  user {
    name
  }
}

改成:

{
  user {
    firstName
    lastName
  }
}

2. 在UserType里自定义name字段,通过resolve方法拼接

要是你不想改查询,想继续用name字段,可以在UserType里手动添加这个字段,通过resolve方法把first_name和last_name拼接起来:

from django.contrib.auth.models import User
from graphene_django import DjangoObjectType
import graphene

class UserType(DjangoObjectType):
    name = graphene.String()

    class Meta:
        model = User
        # 可以指定要包含的字段,或者用exclude排除不需要的
        fields = ("id", "username", "email", "first_name", "last_name", "name")

    def resolve_name(self, info):
        # 按需调整拼接格式,比如去掉空格或者只取其中一个字段
        return f"{self.first_name} {self.last_name}".strip()

这样查询name字段时,Graphene就会调用这个resolve方法返回拼接后的姓名。

3. 自定义User模型(适合长期扩展)

如果你的项目后续需要给User添加更多自定义字段,建议直接基于AbstractUser扩展自己的User模型,添加name字段:

# models.py
from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    name = models.CharField(max_length=255, blank=True)

然后在settings.py里指定默认用户模型:

AUTH_USER_MODEL = 'your_app_name.CustomUser'

之后再用这个CustomUser关联DjangoObjectType,用法就和你之前的自定义User类完全一致了,不用再处理字段映射的问题。

最后记得检查一下你的Schema定义或者前端查询里有没有残留的name引用,同步修改后就能解决这个错误啦!

内容的提问来源于stack exchange,提问作者Freddy Martinez Garcia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:23:40