Bu çözüm, burada yayınlanan diğer çözümlerle neredeyse benzerdir ancak kök düzeyinde çocuk tekrarı sorunu açısından küçük bir farka sahiptir (bunun bir sorun olduğunu düşünüyorsanız). Örnek olarak
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 = (
'name',
'slug',
'parent',
'sub_category'
)
ve eğer bu görüşe sahipsen
class CategoryListAPIView(ListAPIView):
queryset = Category.objects.all()
serializer_class = CategoryListSerializer
Bu, aşağıdaki sonucu verecektir,
[
{
"name": "parent category",
"slug": "parent-category",
"parent": null,
"sub_category": [
{
"name": "child category",
"slug": "child-category",
"parent": 20,
"sub_category": []
}
]
},
{
"name": "child category",
"slug": "child-category",
"parent": 20,
"sub_category": []
}
]
Burada parent category
has a child category
ve json temsili tam olarak temsil edilmesini istediğimiz şeydir.
ancak child category
kök seviyesinde bir tekrarının olduğunu görebilirsiniz .
Bazı insanlar yukarıda yayınlanan yorum bölümlerinde bu çocuk tekrarını kök seviyesinde nasıl durdurabileceğimizi sorduğundan , sorgu kümenizi parent=None
aşağıdaki gibi filtreleyin.
class CategoryListAPIView(ListAPIView):
queryset = Category.objects.filter(parent=None)
serializer_class = CategoryListSerializer
sorunu çözecektir.
NOT: Bu yanıt doğrudan soruyla ilgili olmayabilir, ancak sorun bir şekilde ilişkilidir. Ayrıca bu kullanma yaklaşımı RecursiveSerializer
pahalıdır. Performansa eğilimli diğer seçenekleri kullanırsanız daha iyi olur.