Django rest как показать иерархические данные в api ответе

Я получаю идентификатор категории для GET-запроса, но хочу показать текст в иерархической структуре, например, child1 -> child -> child3

мой ожидаемый ответ будет выглядеть следующим образом

{
'category': 'child1 -> child -> child3'
}

теперь получаю такой ответ

{
'category': 1
}

некоторые вещи выглядят так, как выглядит моя модель, где она показывает название категории в иерархическом порядке enter image description here

моя модель категории

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]

смотрите скриншот, где прямо сейчас я получаю идентификатор, установленный для иерархического текста enter image description here

Одним из способов обеспечения пользовательского вывода в сериализаторе является использование поля 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 и других полезных полях сериализатора.

Вернуться на верх