Получение 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
Есть два варианта, делающие то же самое,
- Сделайте отдельный сериализатор для
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__'
- Используйте метод 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")