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

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

额外说明

  1. 确认你的Profile模型确实包含diretorio和nome字段,且与User模型的OneToOne关联related_name确实是userprofile(对应你设置的related_name='userprofile')。
  2. 如果nome_usuario只是想返回User自身的username,那这个自定义方法可以直接删掉,直接使用fields里的username即可。
  3. 原RidesSerializer代码逻辑没有问题,无需修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 14:19:57