জ্যাঙ্গো বিশ্রাম কাঠামো স্ব-রেফারেন্সিয়াল অবজেক্টগুলিকে নেস্ট করেছে


90

আমার কাছে এমন মডেল রয়েছে যা দেখতে দেখতে:

class Category(models.Model):
    parentCategory = models.ForeignKey('self', blank=True, null=True, related_name='subcategories')
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=500)

আমি সিরিয়ালাইজারের সাথে সমস্ত বিভাগের ফ্ল্যাট জসন উপস্থাপনা পেতে পেরেছি:

class CategorySerializer(serializers.HyperlinkedModelSerializer):
    parentCategory = serializers.PrimaryKeyRelatedField()
    subcategories = serializers.ManyRelatedField()

    class Meta:
        model = Category
        fields = ('parentCategory', 'name', 'description', 'subcategories')

এখন আমি যা করতে চাই তা হল উপশ্রেণী তালিকা তালিকার জন্য তাদের আইডির পরিবর্তে উপ-বিভাগের ইনলাইন জসন প্রতিনিধিত্ব করা। আমি কীভাবে জ্যাঙ্গো-রেস্ট-ফ্রেমওয়ার্ক দিয়ে তা করব? আমি এটি ডকুমেন্টেশনে সন্ধান করার চেষ্টা করেছি, তবে এটি অসম্পূর্ণ বলে মনে হচ্ছে।

উত্তর:


70

ম্যানআরলেটিনফিল্ড ব্যবহার না করে আপনার ক্ষেত্র হিসাবে নেস্টেড সিরিয়াল ব্যবহার করুন:

class SubCategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = ('name', 'description')

class CategorySerializer(serializers.ModelSerializer):
    parentCategory = serializers.PrimaryKeyRelatedField()
    subcategories = serializers.SubCategorySerializer()

    class Meta:
        model = Category
        fields = ('parentCategory', 'name', 'description', 'subcategories')

আপনি যদি ইচ্ছামত নেস্টেড ফিল্ডগুলির সাথে ডিল করতে চান তবে আপনার ডক্সের ডিফল্ট ক্ষেত্রের অংশটি কাস্টমাইজ করা উচিত । আপনি বর্তমানে নিজের উপর একটি ক্ষেত্র হিসাবে সরাসরি সিরিয়ালাইজার ঘোষণা করতে পারবেন না, তবে ডিফল্টরূপে ক্ষেত্রগুলি কী ব্যবহৃত হয় তা ওভাররাইড করতে আপনি এই পদ্ধতিগুলি ব্যবহার করতে পারেন।

class CategorySerializer(serializers.ModelSerializer):
    parentCategory = serializers.PrimaryKeyRelatedField()

    class Meta:
        model = Category
        fields = ('parentCategory', 'name', 'description', 'subcategories')

        def get_related_field(self, model_field):
            # Handles initializing the `subcategories` field
            return CategorySerializer()

প্রকৃতপক্ষে, আপনি উল্লিখিত হিসাবে ঠিক ঠিক না। এটি কিছুটা হ্যাক, তবে সিরিয়ালাইজারটি ইতিমধ্যে ঘোষণার পরে আপনি ক্ষেত্রটি যুক্ত করার চেষ্টা করতে পারেন।

class CategorySerializer(serializers.ModelSerializer):
    parentCategory = serializers.PrimaryKeyRelatedField()

    class Meta:
        model = Category
        fields = ('parentCategory', 'name', 'description', 'subcategories')

CategorySerializer.base_fields['subcategories'] = CategorySerializer()

পুনরাবৃত্ত সম্পর্কগুলি ঘোষণার একটি প্রক্রিয়া এমন কিছু যা যুক্ত করা দরকার।


সম্পাদনা : নোট করুন যে এখন একটি তৃতীয় পক্ষের প্যাকেজ উপলব্ধ রয়েছে যা বিশেষত এই ধরণের ব্যবহারের ক্ষেত্রে ব্যবহার করে। দেখুন djangorestframework-রিকার্সিভ


4
ঠিক আছে, এটি গভীরতার জন্য কাজ করে = 1। আমার যদি অবজেক্ট ট্রিতে আরও স্তর থাকে - বিভাগের উপশ্রেণীতে সাব-ক্যাটাগরি রয়েছে? আমি ইনলাইন বস্তুগুলি সহ নির্বিচারে গভীরতার পুরো গাছকে উপস্থাপন করতে চাই। আপনার পদ্ধতির ব্যবহার করে, আমি উপশ্রেণীশ্রেণীর মধ্যে উপশ্রেণী ক্ষেত্রের সংজ্ঞা দিতে পারি না।
জ্যাসেক চ্যামেলিওস্কি

স্ব-রেফারেন্টাল সিরিয়ালাইজার সম্পর্কিত আরও তথ্যের সাথে সম্পাদিত।
টম ক্রিস্টি

4
এই প্রশ্নটি দেখার জন্য যে কেউ নতুন, আমি খুঁজে পেয়েছি যে প্রতিটি অতিরিক্ত পুনরাবৃত্তির স্তরের জন্য আমাকে দ্বিতীয় সম্পাদনায় শেষ লাইনের পুনরাবৃত্তি করতে হয়েছিল। অদ্ভুত workaround, কিন্তু কাজ বলে মনে হচ্ছে।
জেরেমি ব্লক

4
@ টমচ্রিস্টি আপনি এখনও সন্তানের মূল থেকে পুনরাবৃত্তি করতে পারেন? আমি কীভাবে এটি বন্ধ করতে পারি?
প্রমিথিউস

20
আমি কেবল উল্লেখ করতে চাই, "বেস_ফিল্ডস" আর কাজ করে না। ডিআরএফ 3.1.0 এর সাথে "_dlalared_fields" যেখানে যাদু রয়েছে।
ট্র্যাভিস সোয়েনটেক

50

@ উইজিনের সমাধান আমার পক্ষে দুর্দান্ত কাজ করছিল যতক্ষণ না আমি জ্যাঙ্গো আরইএসটি ফ্রেমওয়ার্ক 3.0.0.0 এ আপগ্রেড করি, যা_জনিতকে অবহেলা করে । এখানে আমার ডিআরএফ 3.0 সমাধান, যা সামান্য পরিবর্তন।

বলুন আপনার কাছে একটি স্ব-রেফারেন্সিয়াল ক্ষেত্র সহ একটি মডেল রয়েছে, উদাহরণস্বরূপ "জবাব" নামে পরিচিত কোনও সম্পত্তি থ্রেড করা মন্তব্য। আপনার কাছে এই মন্তব্য থ্রেডের একটি গাছের উপস্থাপনা রয়েছে এবং আপনি গাছটিকে সিরিয়ালাইজ করতে চান

প্রথমে আপনার পুনরায় ব্যবহারযোগ্য রিকার্সিফিল্ড শ্রেণীর সংজ্ঞা দিন

class RecursiveField(serializers.Serializer):
    def to_representation(self, value):
        serializer = self.parent.parent.__class__(value, context=self.context)
        return serializer.data

তারপরে, আপনার সিরিয়ালাইজারের জন্য, "উত্তরগুলি" এর মান ক্রমিক করতে পুনরাবৃত্তি ফিল্ডটি ব্যবহার করুন

class CommentSerializer(serializers.Serializer):
    replies = RecursiveField(many=True)

    class Meta:
        model = Comment
        fields = ('replies, ....)

সহজ প্যাসি এবং আপনার পুনঃব্যবহারযোগ্য সমাধানের জন্য কেবলমাত্র 4 টি লাইন কোডের প্রয়োজন।

দ্রষ্টব্য: যদি আপনার ডেটা কাঠামো গাছের চেয়ে আরও জটিল হয়, যেমন একটি নির্দেশিত অ্যাসাইক্লিক গ্রাফ (ফ্যানসি!) বলুন তবে আপনি @ wjin এর প্যাকেজ চেষ্টা করতে পারেন - তার সমাধান দেখুন। তবে এমপিটিটি মডেল ভিত্তিক গাছগুলির জন্য এই সমাধানটি নিয়ে আমার কোনও সমস্যা হয়নি।


4
লাইন সিরিয়ালাইজার = স্ব.পিতা.পিতা.পিতা .__ শ্রেণি __ (মান, প্রসঙ্গ = স্বতঃসিদ্ধ) কী করে। এটা কি_প্রেসেন্টেশন () পদ্ধতি?
মরিসিও

এই লাইনটি সবচেয়ে গুরুত্বপূর্ণ অংশ - এটি ক্ষেত্রের প্রতিনিধিত্বকে সঠিক সিরিয়ালাইজারটি রেফারেন্স দেয়। এই উদাহরণে, আমি বিশ্বাস করি এটি কমেন্টরিশালাইজার হবে।
মার্ক চ্যাকেরিয়ান

4
আমি দুঃখিত. আমি বুঝতে পারি না এই কোডটি কী করছে। আমি এটি চালিয়েছি এবং এটি কাজ করে। তবে এটি আসলে কীভাবে কাজ করে তা আমার কোনও ধারণা নেই।
মৌরিসিও

কিছু মুদ্রণ বিবরণীর মতো রাখার চেষ্টা করুন print self.parent.parent.__class__এবংprint self.parent.parent
মার্ক চ্যাকারিয়ান

সমাধান কাজ করে তবে আমার সিরিয়ালাইজারের কাউন্ট আউটপুটটি ভুল। এটি কেবল মূল নোডগুলি গণনা করে। কোন ধারনা? এটি জাঙ্গোরেস্টফ্রেমওয়ার্ক-রিকার্সিভের সাথে একই।
লুকাস ভেগা

39

জ্যাঙ্গো রেস্ট ফ্রেমওয়ার্ক ৩.৩.২ এর সাথে কাজ করে এমন আরেকটি বিকল্প:

class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = ('id', 'name', 'parentid', 'subcategories')

    def get_fields(self):
        fields = super(CategorySerializer, self).get_fields()
        fields['subcategories'] = CategorySerializer(many=True)
        return fields

6
কেন এটি গৃহীত উত্তর নয়? পুরোপুরি কাজ করে।
কার্তিক আরপি

4
এটি খুব সহজভাবে কাজ করে, অন্যান্য সমাধান পোস্ট হওয়ার চেয়ে এই কাজটি করার আমার পক্ষে খুব সহজ সময় ছিল।
নিক বিএল

এই সমাধানটির জন্য অতিরিক্ত শ্রেণির প্রয়োজন নেই এবং স্টাফের চেয়ে বোঝা সহজ parent.parent.__class__। আমি এটি সবচেয়ে পছন্দ করি।
সের্গেইকোলস্নিকভ

অজগর 3 এ, এটি এর মতো হতে পারে:fields = super().get_fields()
এলিনালদো মন্টেইরো

30

এখানে খেলতে দেরীতে, তবে এখানে আমার সমাধান। আসুন আমি বলি যে আমি একটি বেলাহকে সিরিয়াল করছি, একাধিক বাচ্চাও ব্লাহ টাইপ করে।

    class RecursiveField(serializers.Serializer):
        def to_native(self, value):
            return self.parent.to_native(value)

এই ক্ষেত্রটি ব্যবহার করে আমি আমার পুনরাবৃত্তভাবে সংজ্ঞায়িত অবজেক্টগুলিকে ক্রিয়াকলাপ করতে পারি যার মধ্যে অনেকগুলি শিশু-বস্তু রয়েছে

    class BlahSerializer(serializers.Serializer):
        name = serializers.Field()
        child_blahs = RecursiveField(many=True)

আমি DRF3.0 এর জন্য একটি পুনরাবৃত্ত ক্ষেত্র লিখেছি এবং এটি পিপ https://pypi.python.org/pypi/djangorestframework-recursive/ এর জন্য প্যাকেজ করেছি


4
একটি এমপিটিটিমোডেলকে সিরিয়ালকরণের সাথে কাজ করে। সুন্দর!
মার্ক চ্যাকেরিয়ান

4
আপনি এখনও সন্তানের মূল থেকে পুনরাবৃত্তি পেতে? আমি কীভাবে এটি বন্ধ করতে পারি?
প্রমিথিউস

দুঃখিত @ স্পুটনিক আপনি কী বলতে চাইছেন তা আমি বুঝতে পারি না। আমি এখানে যা দিয়েছি তা সেই ক্ষেত্রে কাজ করে যেখানে আপনার ক্লাস রয়েছে Blahএবং এটির একটি ক্ষেত্র রয়েছে child_blahsযা Blahঅবজেক্টের একটি তালিকা নিয়ে গঠিত ।
wjin

4
আমি ডিআরএফ 3.0 এ আপগ্রেড না হওয়া পর্যন্ত এটি দুর্দান্ত কাজ করছিল, তাই আমি একটি 3.0 বৈচিত্র পোস্ট করলাম।
মার্ক চ্যাকেরিয়ান

4
@ ফ্যালকন 1 আপনি ক্যোয়ারসেট ফিল্টার করতে পারবেন এবং কেবলমাত্র মতামতগুলিতে রুট নোডগুলি পাস করতে পারেন queryset=Class.objects.filter(level=0)। এটি বাকী জিনিস নিজেই পরিচালনা করে।
ছানতাল

15

আমি এ ব্যবহার করে এই ফলাফলটি অর্জন করতে সক্ষম হয়েছি serializers.SerializerMethodField। আমি নিশ্চিত নই যে এটি সর্বোত্তম উপায় কিনা তবে আমার পক্ষে কাজ করেছেন:

class CategorySerializer(serializers.ModelSerializer):

    subcategories = serializers.SerializerMethodField(
        read_only=True, method_name="get_child_categories")

    class Meta:
        model = Category
        fields = [
            'name',
            'category_id',
            'subcategories',
        ]

    def get_child_categories(self, obj):
        """ self referral field """
        serializer = CategorySerializer(
            instance=obj.subcategories_set.all(),
            many=True
        )
        return serializer.data

4
আমার জন্য এটি এই সমাধান এবং ইপ্রিজের সমাধানের মধ্যে একটি পছন্দ নেমে এসেছে । তারা পোস্ট করা সমাধানগুলির চেয়ে উভয়ই পরিষ্কার এবং সহজ। এখানে সমাধানটি বিজয়ী হয়েছে কারণ আমি দেখতে পেয়েছি যে এখানে ওপি দ্বারা উপস্থাপিত সমস্যা সমাধানের সর্বোত্তম উপায় এবং একই সাথে ক্ষেত্রগুলি ক্রমিকভাবে নির্বাচিত করার জন্য এই সমাধানটিকে সমর্থন করে । ইরেপেজের সমাধানটি অসীম পুনরাবৃত্তি ঘটায় বা পুনরাবৃত্তি এড়াতে এবং ক্ষেত্রগুলি সঠিকভাবে নির্বাচন করতে অতিরিক্ত জটিলতার প্রয়োজন।
লুই

9

আরেকটি বিকল্প হ'ল আপনার মডেলটিকে সিরিয়ালাইজ করে এমন দৃশ্যে পুনরাবৃত্তি করা। এখানে একটি উদাহরণ:

class DepartmentSerializer(ModelSerializer):
    class Meta:
        model = models.Department


class DepartmentViewSet(ModelViewSet):
    model = models.Department
    serializer_class = DepartmentSerializer

    def serialize_tree(self, queryset):
        for obj in queryset:
            data = self.get_serializer(obj).data
            data['children'] = self.serialize_tree(obj.children.all())
            yield data

    def list(self, request):
        queryset = self.get_queryset().filter(level=0)
        data = self.serialize_tree(queryset)
        return Response(data)

    def retrieve(self, request, pk=None):
        self.object = self.get_object()
        data = self.serialize_tree([self.object])
        return Response(data)

এটি দুর্দান্ত, আমার একটি নির্বিচারে গভীর গাছ ছিল যা আমার সিরিয়ালাইজ করার দরকার ছিল এবং এটি একটি কবজির মতো কাজ করেছিল!
ভায়ার অরি রিনিসন

ভাল এবং খুব দরকারী উত্তর। মডেলশিরাইজারে বাচ্চাদের প্রাপ্তির সময় আপনি শিশু উপাদান পাওয়ার জন্য কোনও ক্যোয়ারসেট নির্দিষ্ট করতে পারবেন না। এই ক্ষেত্রে আপনি এটি করতে পারেন।
এফ্রিন

8

আমি সম্প্রতি একই সমস্যা পেয়েছি এবং এমন একটি সমাধান নিয়ে এসেছি যা মনে হয় এতদূর কাজ করে, এমনকি নির্বিচারে গভীরতার জন্যও। সমাধানটি টম ক্রিস্টির কাছ থেকে নেওয়া একটি ছোট্ট পরিবর্তন:

class CategorySerializer(serializers.ModelSerializer):
    parentCategory = serializers.PrimaryKeyRelatedField()

    def convert_object(self, obj):
        #Add any self-referencing fields here (if not already done)
        if not self.fields.has_key('subcategories'):
            self.fields['subcategories'] = CategorySerializer()      
        return super(CategorySerializer,self).convert_object(obj) 

    class Meta:
        model = Category
        #do NOT include self-referencing fields here
        #fields = ('parentCategory', 'name', 'description', 'subcategories')
        fields = ('parentCategory', 'name', 'description')
#This is not needed
#CategorySerializer.base_fields['subcategories'] = CategorySerializer()

আমি নিশ্চিত না যে এটি কোনও পরিস্থিতিতে নির্ভরযোগ্যভাবে কাজ করতে পারে , যদিও ...


4
২.৩.৮ অনুসারে রূপান্তরকরণের কোনও পদ্ধতি নেই। তবে টু_নেটিভ পদ্ধতিতে ওভাররাইড করে একই জিনিসটি করা যেতে পারে।
অভাগ

6

এটি ক্যাফিরগিঙ্কা দ্রবণ থেকে একটি রূপান্তর যা ড্রাফ 3.0.০.৫ এবং জাজানো ২.7.৪ এ কাজ করে:

class CategorySerializer(serializers.ModelSerializer):

    def to_representation(self, obj):
        #Add any self-referencing fields here (if not already done)
        if 'branches' not in self.fields:
            self.fields['subcategories'] = CategorySerializer(obj, many=True)      
        return super(CategorySerializer, self).to_representation(obj) 

    class Meta:
        model = Category
        fields = ('id', 'description', 'parentCategory')

নোট করুন যে 6th ষ্ঠ লাইনে ক্যাটাগরিশায়ালাইজারকে অবজেক্ট এবং বহু = সত্য বৈশিষ্ট্য সহ বলা হয় attrib


আশ্চর্যজনক, এটি আমার পক্ষে কাজ করেছিল। যাইহোক, আমি মনে করি if 'branches'এটিকে পরিবর্তন করতে হবেif 'subcategories'
ভবদা

6

আমি ভেবেছিলাম আমি মজাতে যোগ দেব!

উইজিন এবং মার্ক চ্যাকেরিয়ান এর মাধ্যমে আমি আরও একটি সাধারণ সমাধান তৈরি করেছি, যা সরাসরি গাছের মতো মডেল এবং গাছের কাঠামোর জন্য কাজ করে যার একটি মডেল মাধ্যমে থাকে। আমি নিশ্চিত নই যে এটি তার নিজস্ব উত্তরের সাথে অন্তর্ভুক্ত কিনা তবে আমি ভেবেছিলাম আমি ভালভাবে এটি অন্য কোথাও রেখে দিয়েছি। আমি একটি ম্যাক্স_ডেপথ বিকল্পটি অন্তর্ভুক্ত করেছি যা অনন্ত পুনরাবৃত্তি রোধ করবে, গভীর স্তরে শিশুদের ইউআরএলএস হিসাবে উপস্থাপন করা হয়েছে (এটি যদি আপনি url না হন তবে এটিই চূড়ান্ত অন্য একটি ধারা)।

from rest_framework.reverse import reverse
from rest_framework import serializers

class RecursiveField(serializers.Serializer):
    """
    Can be used as a field within another serializer,
    to produce nested-recursive relationships. Works with
    through models, and limited and/or arbitrarily deep trees.
    """
    def __init__(self, **kwargs):
        self._recurse_through = kwargs.pop('through_serializer', None)
        self._recurse_max = kwargs.pop('max_depth', None)
        self._recurse_view = kwargs.pop('reverse_name', None)
        self._recurse_attr = kwargs.pop('reverse_attr', None)
        self._recurse_many = kwargs.pop('many', False)

        super(RecursiveField, self).__init__(**kwargs)

    def to_representation(self, value):
        parent = self.parent
        if isinstance(parent, serializers.ListSerializer):
            parent = parent.parent

        lvl = getattr(parent, '_recurse_lvl', 1)
        max_lvl = self._recurse_max or getattr(parent, '_recurse_max', None)

        # Defined within RecursiveField(through_serializer=A)
        serializer_class = self._recurse_through
        is_through = has_through = True

        # Informed by previous serializer (for through m2m)
        if not serializer_class:
            is_through = False
            serializer_class = getattr(parent, '_recurse_next', None)

        # Introspected for cases without through models.
        if not serializer_class:
            has_through = False
            serializer_class = parent.__class__

        if is_through or not max_lvl or lvl <= max_lvl: 
            serializer = serializer_class(
                value, many=self._recurse_many, context=self.context)

            # Propagate hereditary attributes.
            serializer._recurse_lvl = lvl + is_through or not has_through
            serializer._recurse_max = max_lvl

            if is_through:
                # Delay using parent serializer till next lvl.
                serializer._recurse_next = parent.__class__

            return serializer.data
        else:
            view = self._recurse_view or self.context['request'].resolver_match.url_name
            attr = self._recurse_attr or 'id'
            return reverse(view, args=[getattr(value, attr)],
                           request=self.context['request'])

4
এটি একটি খুব পুঙ্খানুপুঙ্খ সমাধান, তবে এটি লক্ষণীয় যে আপনার elseক্লজটি ভিউ সম্পর্কে কিছু নির্দিষ্ট ধারণা তৈরি করে। আমার সাথে আমার প্রতিস্থাপন করতে হয়েছিল return value.pkতাই এটি ভিউটিকে উল্টানোর চেষ্টা করার পরিবর্তে প্রাথমিক কীগুলি ফিরিয়ে দিয়েছে।
সোভিয়েট

4

জ্যাঙ্গো আরইএসটি ফ্রেমওয়ার্ক 3.3.1 এর সাথে, উপশ্রেণী বিভাগগুলিতে বিভাগগুলিতে যুক্ত করতে আমার নিম্নলিখিত কোডের প্রয়োজন ছিল:

মডেল.পি

class Category(models.Model):

    id = models.AutoField(
        primary_key=True
    )

    name = models.CharField(
        max_length=45, 
        blank=False, 
        null=False
    )

    parentid = models.ForeignKey(
        'self',
        related_name='subcategories',
        blank=True,
        null=True
    )

    class Meta:
        db_table = 'Categories'

সিরিয়ালাইজার.পি

class SubcategorySerializer(serializers.ModelSerializer):

    class Meta:
        model = Category
        fields = ('id', 'name', 'parentid')


class CategorySerializer(serializers.ModelSerializer):
    subcategories = SubcategorySerializer(many=True, read_only=True)

    class Meta:
        model = Category
        fields = ('id', 'name', 'parentid', 'subcategories')

2

এই সমাধানটি এখানে পোস্ট করা অন্যান্য সমাধানগুলির সাথে প্রায় একই রকম তবে মূল স্তরে শিশু পুনরাবৃত্তি সমস্যার ক্ষেত্রে কিছুটা পার্থক্য রয়েছে (যদি আপনি এটিকে সমস্যা হিসাবে মনে করেন)। একটি উদাহরণ জন্য

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এবং জসনের উপস্থাপনা হ'ল আমরা এটির প্রতিনিধিত্ব করতে চাই।

তবে আপনি দেখতে পাচ্ছেন child categoryযে মূল স্তরের একটি পুনরাবৃত্তি রয়েছে ।

কিছু লোক উপরোক্ত পোস্ট করা উত্তরগুলির মন্তব্যে যেমন জিজ্ঞাসা করছে যে আমরা কীভাবে এই স্তরের পুনরাবৃত্তিটি মূল স্তরে থামাতে পারি , কেবল আপনার ক্যোয়ারসেটটি ফিল্টার করুন parent=Noneযেমন নীচের মত

class CategoryListAPIView(ListAPIView):
    queryset = Category.objects.filter(parent=None)
    serializer_class = CategoryListSerializer

এটি সমস্যার সমাধান করবে।

দ্রষ্টব্য: এই উত্তরটি সরাসরি প্রশ্নের সাথে সম্পর্কিত নাও হতে পারে তবে সমস্যাটি কোনওভাবেই সম্পর্কিত। এছাড়াও ব্যবহার করার এই পদ্ধতির RecursiveSerializerব্যয়বহুল। পারফরম্যান্স প্রবণ এমন অন্যান্য বিকল্পগুলি ব্যবহার করা ভাল।


ফিল্টার সহ ক্যোরিসেটটি আমার জন্য ত্রুটি ঘটায়। তবে এটি পুনরাবৃত্তি ক্ষেত্র থেকে মুক্তি পেতে সহায়তা করেছিল। Serializer ক্লাসে ওভাররাইড to_representation পদ্ধতি: stackoverflow.com/questions/37985581/...
হারুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.