使用自定义Django模型对接DRF TokenAuthentication报is_active属性错误求助
错误原因
DRF 自带的 IsAuthenticated 权限类、TokenAuthentication 认证逻辑默认都会校验用户对象的 is_active 属性,你当前完全自定义的 User 模型既没有继承 Django 内置的用户基类,也没有手动添加该属性,因此触发属性不存在的报错。
解决方案
推荐按优先级选择以下方案:
方案一(最推荐):自定义用户模型继承 Django 内置
AbstractUser
该方案可以直接复用 Django 封装好的is_active、is_authenticated、密码加密、用户状态管理等成熟能力,无需自己重复实现基础逻辑。
调整你的models.py中 User 类定义:from django.contrib.auth.models import AbstractUser class User(AbstractUser): # 保留你自定义的字段,AbstractUser自带的用户名、邮箱、密码等字段无需重复声明 birth = models.DateField()同时需要在
settings.py中声明自定义用户模型:AUTH_USER_MODEL = '你的应用名.User'调整完成后执行数据库迁移命令即可:
python manage.py makemigrations python manage.py migrate方案二:纯自定义用户模型手动补充必要属性
如果你确定不需要 Django 内置用户体系的其他能力,只想保留现有自定义结构,可以直接在 User 模型中添加is_active字段:class User(models.Model): name = models.CharField(max_length=100) email = models.EmailField() birth = models.DateField() # 新增激活状态字段,默认值设为True代表新用户默认激活 is_active = models.BooleanField(default=True, verbose_name="是否激活")如果你不需要控制用户激活状态,也可以用属性装饰器直接返回固定值,无需新增数据库字段:
class User(models.Model): name = models.CharField(max_length=100) email = models.EmailField() birth = models.DateField() @property def is_active(self): # 所有用户默认都是激活状态 return True
注意:不建议通过重写
TokenAuthentication的authenticate_credentials方法跳过is_active校验,该操作会绕过用户状态验证,存在安全风险。
内容的提问来源于stack exchange,提问作者Mohammad Imam Hossain
相关产品推荐
相关产品推荐

