জ্যাঙ্গো রেস্ট ফ্রেমওয়ার্ক ব্যবহার করে আমি কীভাবে সম্পর্কিত মডেল ক্ষেত্রগুলি অন্তর্ভুক্ত করব?


154

আসুন আমরা বলি যে আমাদের নীচের মডেল রয়েছে:

class Classroom(models.Model):
    room_number = [....]

class Teacher(models.Model):
    name = [...]
    tenure = [...]
    classroom = models.ForeignKey(Classroom)

ম্যানআরলেটেডপ্রাইমারিকিফিল্ড ফাংশন অনুসারে এর মতো ফলাফল পাওয়ার পরিবর্তে বলি:

{
    "room_number": "42", 
    "teachers": [
        27, 
        24, 
        7
    ]
},

এটি এমন কিছু ফেরত পাঠান যাতে এর সাথে সম্পূর্ণ সম্পর্কিত মডেল উপস্থাপনা অন্তর্ভুক্ত থাকে:

{
    "room_number": "42", 
    "teachers": [
        {
           'id':'27,
           'name':'John',
           'tenure':True
        }, 
        {
           'id':'24,
           'name':'Sally',
           'tenure':False
        }, 
    ]
},

এটা কি সম্ভব? যদি তাই হয়, কিভাবে? এবং এটি কি একটি খারাপ ধারণা?

উত্তর:


242

সবচেয়ে সহজ উপায় গভীরতা যুক্তি ব্যবহার করা use

class ClassroomSerializer(serializers.ModelSerializer):
    class Meta:
        model = Classroom
        depth = 1

যাইহোক, এটি কেবল সামনের সম্পর্কের জন্য সম্পর্ককে অন্তর্ভুক্ত করবে, যা এই ক্ষেত্রে আপনার প্রয়োজনের মতো নয়, যেহেতু শিক্ষক ক্ষেত্র একটি বিপরীত সম্পর্ক।

যদি আপনি আরও জটিল প্রয়োজনীয়তা পেয়ে থাকেন (যেমন, বিপরীত সম্পর্ক অন্তর্ভুক্ত, কিছু ক্ষেত্র নীড়, তবে অন্য নয়, বা নীড় শুধুমাত্র ক্ষেত্রগুলির একটি নির্দিষ্ট উপসেট) বাসা বাঁধতে পারেন সিরিয়ালাইজারগুলি , যেমন ...

class TeacherSerializer(serializers.ModelSerializer):
    class Meta:
        model = Teacher
        fields = ('id', 'name', 'tenure')

class ClassroomSerializer(serializers.ModelSerializer):
    teachers = TeacherSerializer(source='teacher_set')

    class Meta:
        model = Classroom

নোট করুন যে ক্ষেত্রের উত্স হিসাবে ব্যবহারের জন্য বৈশিষ্ট্য নির্দিষ্ট করতে আমরা সিরিয়ালাইজার ক্ষেত্রে উত্স যুক্তি ব্যবহার করি। আমরা ড্রপ পারে sourceপরিবর্তে নিশ্চিত করে যুক্তি teachersঅ্যাট্রিবিউট ব্যবহার করে বিদ্যমান related_name আপনার বিকল্পটি Teacherমডেল, অর্থাত।classroom = models.ForeignKey(Classroom, related_name='teachers')

একটি বিষয় মনে রাখবেন যে নেস্টেড সিরিয়ালাইজরা বর্তমানে লেখার ক্রিয়াকলাপ সমর্থন করে না। লিখনযোগ্য উপস্থাপনার জন্য আপনার পিকে বা হাইপারলিংকের মতো নিয়মিত ফ্ল্যাট উপস্থাপনা ব্যবহার করা উচিত।


আমি যখন প্রথম সমাধানটি চেষ্টা করেছিলাম তখন আমি শিক্ষকদের কাছে পাইনি, তবে আমি ক্লাসরুমের পিতামাতার উদাহরণ পেয়েছি (যা এই উদাহরণটি দেখায় না)। দ্বিতীয় সমাধানে আমি একটি ত্রুটি পেয়েছি - "'শ্রেণিকক্ষ' অবজেক্টের কোনও শিক্ষক 'শিক্ষক' নেই। আমি কিছু অনুপস্থিত করছি?
চজ

1
depthএই ক্ষেত্রে আপনার যা প্রয়োজন তা কেন করবেন না এবং আপনি যে ব্যতিক্রম দেখছেন এবং কীভাবে এটি মোকাবেলা করবেন সে সম্পর্কে ব্যাখ্যা দেওয়ার জন্য @ ছাজ উত্তরটি আপডেট করেছেন ।
টম ক্রিস্টি

1
আমি একজন নির্বোধ এবং ভুল সার্ভারটি মারছিলাম। এটি অবশ্যই অনেকগুলি থেকে বহু সম্পর্কের মধ্যে কাজ করে।
yellottyellott

15
বাসা বাঁধতে সিরিয়ালাইজার দুর্দান্ত! আমাকে এটি করতে হয়েছিল এবং ডিআরএফ 3.1.0 ব্যবহার করছিলাম। আমাকেও এর many=Trueমতো করে অন্তর্ভুক্ত করতে হয়েছিল ...TeacherSerializer(source='teacher_set', many=True)। অন্যথায় আমি নিম্নলিখিত ত্রুটিটি পেয়েছিলাম:The serializer field might be named incorrectly and not match any attribute or key on the 'RelatedManager' instance. Original exception text was: 'RelatedManager' object has no attribute 'type'.
কার্তিক রঘুপতি

2
একটি ফরেনকির বিপরীত দিকটি ..._setডিফল্টরূপে নামকরণ করা হবে । আরও বিশদের জন্য জ্যাঙ্গো ডক্সটি
টম ক্রিস্টি

36

আপনাকে ধন্যবাদ টমক্রিসটি !!! আপনি আমাকে অনেক সাহায্য করেছেন! আমি আপডেট করতে চাই যে সামান্য (একটি ভুলের কারণে আমি ছুটে এসেছি)

class TeacherSerializer(serializers.ModelSerializer):
    class Meta:
        model = Teacher
        fields = ('id', 'name', 'tenure')

class ClassroomSerializer(serializers.ModelSerializer):
    teachers = TeacherSerializer(source='teacher_set', many=True)

    class Meta:
        model = Classroom
        field = ("teachers",)

2

এটি ড্রাফ-ফ্লেক্স-ফিল্ডস নামে পরিচিত একটি খুব সহজে ব্যবহারযোগ্য ড্যান্ডি জ্যাঙ্গো প্যাকেজ ব্যবহার করেও অর্জন করা যায় । আমরা এটি ব্যবহার করি এবং এটি দুর্দান্ত। আপনি কেবল এটি ইনস্টল করুন pip install drf-flex-fields, এটি আপনার সিরিয়ালাইজারের মাধ্যমে পাস করুন, যুক্ত করুন expandable_fieldsএবং বিঙ্গো (নীচের উদাহরণ)। এটি আপনাকে ডট স্বরলিপি ব্যবহার করে গভীর নেস্টেড সম্পর্কগুলি নির্দিষ্ট করার অনুমতি দেয়।

from rest_flex_fields import FlexFieldsModelSerializer

class ClassroomSerializer(FlexFieldsModelSerializer):
    class Meta:
        model = Model
        fields = ("teacher_set",)
        expandable_fields = {"teacher_set": (TeacherSerializer, {"source": "teacher_set"})}

তারপরে আপনি ?expand=teacher_setআপনার ইউআরএল যুক্ত করুন এবং এটি একটি প্রসারিত প্রতিক্রিয়া দেয়। আশা করি এটি কাউকে সাহায্য করবে, কোনও দিন। চিয়ার্স!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.