使用Django Auth User类与Graphene开发时遇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

