Django rest как показать иерархические данные в api ответе
Я получаю идентификатор категории для GET-запроса, но хочу показать текст в иерархической структуре, например, child1 -> child -> child3
мой ожидаемый ответ будет выглядеть следующим образом
{
'category': 'child1 -> child -> child3'
}
теперь получаю такой ответ
{
'category': 1
}
некоторые вещи выглядят так, как выглядит моя модель, где она показывает название категории в иерархическом порядке
моя модель категории
class Product_category(models.Model):
domain = models.CharField(max_length=250)
parent_category = models.ForeignKey('self',on_delete=models.CASCADE,null=True, blank=True)
category_name = models.CharField(max_length=200,null=True,blank=True,)
category_icon = models.ImageField(upload_to=dynamic_icon_upload_path,blank=True,null=True)
def get_hierarchical_name(self):
if self.parent_category:
return f"{self.parent_category.get_hierarchical_name()}->{self.category_name}"
else:
return f"{self.category_name}"
def __str__(self):
return self.get_hierarchical_name()
моя модель продукта
class Product(models.Model):
title = models.CharField(max_length=200,blank=True,null=True)
category = models.ForeignKey(Product_category,blank=True,null=True,on_delete=models.CASCADE)
мой серилайзер
class ParentProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = ['category',...others product fields]
смотрите скриншот, где прямо сейчас я получаю идентификатор, установленный для иерархического текста
Одним из способов обеспечения пользовательского вывода в сериализаторе является использование поля SerializerMethodField. Если вы хотите переопределить способ представления поля category
, определите атрибут category
на сериализаторе, который является SerializerMethodField. Затем определите метод сериализатора под названием get_category
. Этот метод будет вызываться сериализатором для предоставления значения поля SerializerMethodField. Вы можете сделать так, чтобы этот метод возвращал строковое представление категории товара.
class ParentProductSerializer(serializers.ModelSerializer):
category = serializers.SerializerMethodField()
class Meta:
model = Product
fields = ['category',...others product fields]
def get_category(self, instance):
return str(instance.category)
В документации Django REST Framework есть дополнительная информация о SerializerMethodField и других полезных полях сериализатора.