Django自定义Customer用户调用objects报AttributeError怎么解决?
问题原因
出现AttributeError: type object 'Customer' has no attribute 'objects'的核心原因是自定义用户类Customer缺少默认的模型管理器,常见场景有两种:
- 继承
AbstractBaseUser时没有显式声明管理器objects:AbstractBaseUser不会像普通Django模型一样自动注入默认的objects管理器,需要手动指定 Customer类中自定义了其他名称的管理器,覆盖了默认的objects名称,或者自定义的管理器没有正确继承models.Manager/UserManager
解决方案
步骤1:修改account/models.py中的Customer类
给Customer类显式添加管理器,无自定义管理器需求的话直接使用Django自带的UserManager即可:
from django.contrib.auth.models import AbstractBaseUser, UserManager, PermissionsMixin from django.db import models class Customer(AbstractBaseUser, PermissionsMixin): # 你原本的字段定义(用户名、邮箱、手机号等) # 必须指定USERNAME_FIELD、REQUIRED_FIELDS USERNAME_FIELD = '你的用户唯一标识字段名(比如phone/email)' REQUIRED_FIELDS = ['其他必填字段'] # 显式添加objects管理器 objects = UserManager() # 你原本的其他业务代码
如果有自定义查询需求,可以自定义管理器继承UserManager后再赋值给objects。
步骤2:检查同名覆盖
确认你在Customer类中没有定义名为objects的普通字段、方法或者其他属性,避免覆盖管理器。
步骤3:(可选)配置全局用户模型
在项目settings.py中添加配置,指定Django全局使用你的自定义用户类:
AUTH_USER_MODEL = 'account.Customer'
配置后可以通过get_user_model()获取用户类,避免硬编码导入,也能规避部分循环导入问题,post/forms.py代码可以修改为:
from django.contrib.auth import get_user_model from django import forms Customer = get_user_model() class PostForm(forms.ModelForm): client_code = forms.ModelChoiceField( queryset=Customer.objects.all(), required=True, widget=forms.Select( attrs={ 'class':'form-select form-select-sm', 'aria-label':'Default select example', } ) ) # 其他原有代码
其他排查方向
如果上述操作完成后问题仍存在,检查是否存在循环导入:确认account/models.py中没有导入post应用的任何模块,避免导入时Customer类还未完成初始化就被调用。
内容的提问来源于stack exchange,提问作者Zazzasaur
相关产品推荐
相关产品推荐

