я работаю с вложенными самореферентными объектами django, и у меня есть следующая Category
модель
class CategoryManager(models.Manager):
def all(self):
qs = super(CategoryManager, self).filter(parent=None)
return qs
class Category(models.Model):
name = models.CharField(max_length=250)
slug = models.SlugField(max_length=255, unique=True)
description = models.TextField(blank=True)
# description_json = JSONField(blank=True, default=dict)
parent = models.ForeignKey(
"self", null=True, blank=True, related_name="sub_category", on_delete=models.CASCADE
)
background_image = models.ImageField(
upload_to="category-backgrounds", blank=True, null=True
)
objects = CategoryManager
для рекурсивного представления, я применил следующие сериализаторы
class RecursiveSerializer(serializers.Serializer):
def to_representation(self, value):
serializer = self.parent.parent.__class__(value, context=self.context)
return serializer.data
class CategoryListSerializer(ModelSerializer):
sub_category = RecursiveSerializer(many=True, read_only=True)
class Meta:
model = Category
fields = (
# 'url',
'name',
'slug',
'description',
'parent',
'background_image',
'sub_category'
)
и view,
class CategoryListAPIView(ListAPIView):
queryset = Category.objects.all()
serializer_class = CategoryListSerializer
создает следующий результат.
[
{
"name": "Food",
"slug": "food",
"description": "",
"parent": null,
"background_image": null,
"background_image_alt": "",
"sub_category": [
{
"name": "Rice",
"slug": "rice",
"description": "",
"parent": 20,
"background_image": null,
"background_image_alt": "",
"sub_category": []
}
]
},
{
"name": "Rice",
"slug": "rice",
"description": "",
"parent": 20,
"background_image": null,
"background_image_alt": "",
"sub_category": []
}
]
Здесь у родительской категории Food
есть дочерняя категория Rice
, что хорошо, но проблема в том, что ребенок категория Rice
повторяется на уровне root, как я могу это остановить.