यह समाधान यहां पोस्ट किए गए अन्य समाधानों के साथ लगभग समान है लेकिन मूल स्तर पर बाल पुनरावृत्ति की समस्या के संदर्भ में थोड़ा अंतर है (यदि आप इसे एक समस्या मानते हैं)। एक उदाहरण के लिए
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'
)
और अगर आपके पास यह दृश्य है
class CategoryListAPIView(ListAPIView):
queryset = Category.objects.all()
serializer_class = CategoryListSerializer
यह निम्नलिखित परिणाम का उत्पादन करेगा,
[
{
"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": []
}
]
यहाँ parent category
एक child category
और json प्रतिनिधित्व है, ठीक वैसा ही जैसा हम चाहते हैं कि वह प्रतिनिधित्व करे।
लेकिन आप देख सकते हैं child category
कि जड़ स्तर पर एक पुनरावृत्ति है।
जैसा कि कुछ लोग उपरोक्त पोस्ट किए गए उत्तर के टिप्पणी अनुभागों में पूछ रहे हैं कि हम इस बच्चे की पुनरावृत्ति को जड़ स्तर पर कैसे रोक सकते हैं , बस अपनी क्वेरी parent=None
को निम्न प्रकार से फ़िल्टर करें
class CategoryListAPIView(ListAPIView):
queryset = Category.objects.filter(parent=None)
serializer_class = CategoryListSerializer
यह समस्या को हल करेगा।
नोट: यह उत्तर सीधे प्रश्न से संबंधित नहीं हो सकता है, लेकिन समस्या किसी तरह से संबंधित है। इसके अलावा उपयोग करने का यह तरीका RecursiveSerializer
महंगा है। बेहतर है यदि आप अन्य विकल्पों का उपयोग करते हैं जो प्रदर्शन प्रवण हैं।