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

序列化商品图片时触发AttributeError,请求排查解决方案

错误原因分析

这个错误的核心是反向关联名称不匹配:

  • Picture模型通过ForeignKey关联到Product,Django默认会为Product生成名为picture_set的反向关联属性(规则为模型名小写_set)。
  • 但你在ProductSerializer里直接用picture作为字段名,Product实例不存在这个属性,因此触发AttributeError。
解决办法

两种修复方式任选其一即可:

方式一:修改模型,指定反向关联名称

在Picture模型的ForeignKey字段中添加related_name参数,让Django将反向关联属性命名为picture,与序列化器字段名匹配:

class Picture(models.Model):
    picture = models.ImageField(null=True, blank=True, default='/placeholder.png')
    # 新增related_name参数
    product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='picture')

    def __str__(self):
        return str(self.picture)

方式二:修改序列化器,指定字段来源

无需改动模型,在ProductSerializer的picture字段中通过source参数指向默认的反向关联属性picture_set:

class ProductSerializer(serializers.ModelSerializer):
    category = serializers.ReadOnlyField(source='category.name')
    discount = serializers.ReadOnlyField(source='discount.name')
    # 新增source参数指定正确的关联属性
    picture = ProductImageSerializer(many=True, source='picture_set')

    class Meta:
        model = Product
        fields = ['_id', 'category', 'discount', 'name_geo', 'picture', 'brand', 'size',
                  'technicalRequirements', 'instructionForUse', 'safetyStandard',
                  'youtubeUrl', 'price', 'createdAt', 'user']

额外优化建议

如果追求语义化可读性,推荐把related_name设为pictures(复数形式更符合“一个商品对应多张图片”的逻辑),同时将序列化器里的字段名也改为pictures,代码的直观性会更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:21:49