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

使用AbstractUser自定义用户模型后序列化报错:'str'无'_meta'属性

问题解决:AttributeError: 'str' object has no attribute '_meta'

核心原因

你的UserSerializer中,model = User这里的User是从settings.AUTH_USER_MODEL获取的字符串(比如"myapp.User"),而ModelSerializer要求传入实际的模型类对象,不是字符串,这就导致序列化时无法识别模型的元数据,抛出_meta不存在的错误。

修复步骤

方法1:直接导入自定义User模型

修改序列化器代码,替换掉从settings获取字符串的方式,直接导入你的模型类:

from rest_framework import serializers
from your_app_name.models import User  # 替换成你的app名称

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'  # 或者指定需要的字段

方法2:使用Django推荐的get_user_model()

这是更通用的方式,适用于可能更换用户模型的场景:

from rest_framework import serializers
from django.contrib.auth import get_user_model

User = get_user_model()  # 返回当前配置的用户模型类,不是字符串

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

额外注意:密码重复加密问题

你的User模型save方法里调用了make_password(self.password),但自定义管理器CustomUserManager的create_user方法已经调用了user.set_password(password)——这两个操作都会加密密码,导致最终存储的是双重加密后的密码,用户无法正常登录。

解决方式:删除User模型中的save方法,保留管理器里的set_password即可,因为set_password已经会正确处理密码哈希:

# 移除User模型中的这段代码
# def save(self, *args, **kwargs):
#     self.password = make_password(self.password)
#     super(User, self).save(*args, **kwargs)

内容的提问来源于stack exchange,提问作者usamayaseen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 12:33:19