首页 > 解决方案 > /“产品”对象的 AttributeError 没有属性“get_category_display”

问题描述

嗨,我想在我的产品api中显示类别名称而不是显示类别 ID。我写了一个函数来为我做这件事,但我有这个错误:

 AttributeError at /
'Product' object has no attribute 'get_category_display'

我该如何解决?有我的序列化器和类别和产品模型

序列化器:

class ProductSerializer(serializers.ModelSerializer):
    comments = serializers.SerializerMethodField()
    category = serializers.SerializerMethodField()

    class Meta:
        model = Product
        fields = ['id', 'category', 'name', 'slug', 'image_1',
                  'image_2', 'image_3', 'image_4', 'image_5',
                  'description', 'attribute', 'price', 'available', 'created', 'updated',
                  'popular', 'discount', 'comments']
        lookup_field = 'slug'
        extra_kwargs = {
            'url': {'lookup_field': 'slug'}
        }

    def get_comments(self, obj):
        comments_qs = Comment.objects.filter_parents_by_object(obj).order_by('posted')
        return CommentSerializer(comments_qs, many=True).data

    def get_category(self, obj):
        return obj.get_category_display()

楷模:

class Category(models.Model):
    name = models.CharField(max_length=400)

    def __str__(self):
        return self.name


class Product(models.Model):
    category = models.ManyToManyField(Category, related_name='products')
    name = models.CharField(max_length=500)
    slug = models.SlugField(max_length=500, allow_unicode=True, unique=True)
    image_1 = models.ImageField(upload_to='products_pic/%Y/%m/%d/', null=True, blank=True)
   
    description = models.TextField(null=True, blank=True)
    attribute = models.JSONField(null=True, blank=True,
                                 help_text='in this format: {"key" : "value", "key2" : "value2"}')
    price = models.PositiveIntegerField()
    discount = models.PositiveIntegerField(null=True, blank=True)
    available = models.BooleanField(default=True)
    comments = GenericRelation(Comment)

    class Meta:
        ordering = ('-created',)

    def __str__(self):
        return self.name

标签: pythondjangodjango-rest-framework

解决方案


只有具有选项列表的字段具有,您可以使用以下方式显示对象的名称:get_fieldname_display

def get_category(self, obj):
    return [str(c) for c in obj.category.all()]

或者如果Category模型具有例如一个.name字段,您可以使用:

def get_category(self, obj):
    return [c.name for c in obj.category.all()]

推荐阅读