Получение ID категории из поля ManyToManyField вместо названия, прикрепленного к модели категории

Я не хочу, чтобы id сериализовался в api, когда я получаю данные модели продукта, а просто хочу прикрепить заголовок к модели категории. На данный момент вот как выглядят данные.

GET /api/v1/catalogue/1/
{
"id": 1,
"name": "iPhone 13",
"image": "/mediafiles/products/2022/01/30/product-placeholder.png",
"timestamp": "2022-01-30T22:52:11.259452+05:00",
"updated": "2022-01-30T22:52:11.259452+05:00",
"variant": "8gb Ram / 256 Storage",
"product_brand": 1,
"product_category": [
1
]
}

Как вы видите, product_category выдает мне набор id вместо title.

это две модели

class Category(models.Model):
    title = models.CharField(max_length=50)
    image = models.ImageField(upload_to='Categories/%Y/%m/%d', null=True, blank=True,
                              default='/category-placeholder.png')
    ...

    

class Product(models.Model):
    name = models.CharField(max_length=100)
    image = models.ImageField(upload_to='products/%Y/%m/%d', null=True, blank=True,
                              default='/product-placeholder.png')
    product_category = models.ManyToManyField(
        Category, related_name="product_category")
    product_brand = models.ForeignKey(
        Brand, on_delete=models.CASCADE, related_name="product_brand"
    )
    ...
    

Так что я не знаю, как поместить title в набор product_category вместо его id

Есть два варианта, делающие то же самое,

  1. Сделайте отдельный сериализатор для Category и используйте тот же самый в ProductSerializer

Eg.

class CategorySerializer:
    class Meta:
        model = Category
        fields = '__all__

then

class ProductSerializer(serializers.ModelSerializer):
    product_category = CategorySerializer(many=True, read_only=True)
    class Meta:
        model = Product
        fields = '__all__'
  1. Используйте метод SerializerMethodField - ссылка
class ProductSerializer(serializers.ModelSerializer):
    product_category = serializers.SerializerMethodField()
    class Meta:
        model = Product
        fields = '__all__'

    def get_product_category(self, obj):
         return obj.product_category.values_list("title")
Вернуться на верх