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

Django自定义User模型继承与序列化:AttributeError问题排查

问题原因

在Django的一对一关系中,从CustomUser访问关联的ProDetails实例时,默认的反向属性名是全小写的模型名(也就是prodetails),但你在UserSerializer里定义的字段是ProDetails(首字母大写),和默认的属性名不匹配,所以抛出了AttributeError。

解决方法

有两种可行的方案,选一种即可:

方案一:修改序列化器字段名,匹配默认反向属性

把UserSerializer里的ProDetails字段改成小写的prodetails,同时考虑到部分用户可能还没创建关联的ProDetails实例,建议添加required=False和allow_null=True避免报错:

class UserSerializer(ModelSerializer):
    prodetails = ProDetailsSerializer(required=False, allow_null=True)
    class Meta:
        model = CustomUser
        fields = ['email', 'first_name', 'created_at', 'prodetails']

方案二:在模型中指定反向关联名称

在ProDetails模型的OneToOneField里设置related_name参数,指定反向关联的名称为ProDetails,这样你的序列化器代码就不用修改:

class ProDetails(models.Model):
    user = models.OneToOneField(CustomUser, on_delete=models.CASCADE, related_name='ProDetails')
    # 其他字段保持不变...
额外优化建议

为了避免序列化时出现N+1查询(每个用户都单独查询一次ProDetails),可以在视图的get_queryset里用select_related提前关联查询:

def get_queryset(self):
    # 如果用方案一,这里填'prodetails';用方案二则填'ProDetails'
    return CustomUser.objects.all().select_related('prodetails')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 08:07:28