Django序列化报错:'diretorio'非User模型有效字段的解决方法
问题修复方案
错误根源
你遇到的报错是因为CarregaDadosPassageirosSerializer的代码存在几个关键问题:
- 自定义序列化字段(
diretorio、nome_usuario)被错误地放在了Meta类内部,Django序列化器会默认去User模型里查找fields列表中的字段,找不到diretorio就触发报错。 source路径写错了:你的Profile模型和User是OneToOne关联,related_name设的是userprofile,所以正确的关联路径应该是source='userprofile.diretorio',而非user.profile.diretorio。get_nome_usuario方法缩进错误,被包裹在Meta类内部,无法被序列化器识别调用。
修复后的代码
CarregaDadosPassageirosSerializer 修正版
class CarregaDadosPassageirosSerializer(serializers.ModelSerializer): # 自定义字段放在Serializer类顶层,不要嵌套在Meta里 diretorio = serializers.ImageField(source='userprofile.diretorio', read_only=True) nome_usuario = serializers.SerializerMethodField() class Meta: model = User # 把新增的nome_usuario字段加入返回列表 fields = ['id', 'username', 'email', 'diretorio', 'nome_usuario'] # 方法与Serializer类同级,不要缩进在Meta内部 def get_nome_usuario(self, obj): # 按你原代码逻辑,这里应该是取Profile模型的nome字段,所以用obj.userprofile.nome return obj.userprofile.nome
额外说明
- 确认你的Profile模型确实包含
diretorio和nome字段,且与User模型的OneToOne关联related_name确实是userprofile(对应你设置的related_name='userprofile')。 - 如果
nome_usuario只是想返回User自身的username,那这个自定义方法可以直接删掉,直接使用fields里的username即可。 - 原
RidesSerializer代码逻辑没有问题,无需修改。
内容的提问来源于stack exchange,提问作者Pecan30
相关产品推荐
相关产品推荐

