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

DRF开发商品详情页报错Product无get_category_display属性如何解决

错误原因
  • get_<字段名>_display 是Django为带有 choices 参数的模型字段自动生成的方法,仅适用于带可选值的单选型字段。你当前 Product 模型的 categories 是多对多外键关联独立的 Category 模型,不存在该自动生成的方法。
  • 你的模型字段名为复数 categories,调用的方法里使用了单数 category,字段名不匹配也是报错的直接原因。
修复方案

按你当前的模型设计(多对多关联分类表),只需修改序列化器的实现即可:

  1. 替换 get_category 方法逻辑,遍历多对多关联的分类对象返回你需要的展示字段
  2. 在序列化器的 fields 配置中新增你自定义的 category 字段,否则该字段不会正常返回

修改后的序列化器代码示例:

class product_detail_serializer(serializers.ModelSerializer):
    category = serializers.SerializerMethodField()

    class Meta:
        model = Product
        # 若不需要返回原categories(关联分类的id列表),可直接删除fields中的categories项
        fields = ("id", "categories", "category", "item", "slug", "image")
    lookup_field = "id"
        
    def get_category(self, obj):
        # 此处假设Category模型的name字段为分类展示名称,可替换为你实际需要的分类字段
        return [category.name for category in obj.categories.all()]

如果你原本的需求是给商品设置可选值固定的单选分类,不需要独立的分类表,可修改模型字段为带choices的CharField,此时才能正常使用get_category_display方法:

# 模型层修改示例
CATEGORY_CHOICES = (
    ('electronics', '电子产品'),
    ('clothing', '服饰'),
    # 其他分类选项
)
class Product(models.Model):
    # 替换原多对多categories字段为如下字段
    category = models.CharField(max_length=100, choices=CATEGORY_CHOICES)
    # 其余原有字段保持不变

内容的提问来源于stack exchange,提问作者C-Bizz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:45:04