2016-02-18 8 views
7

मैं Django 1.6 (बहुत जल्द 1.8 तक अपग्रेड कर रहा हूं), पायथन 2.7, और डीआरएफ 3.2.5 (बहुत जल्द नवीनतम में अपग्रेड कर रहा हूं) का उपयोग कर रहा हूं।नेस्टेड धारावाहिकों में विरासत संदर्भ को अनुमति देने के लिए django आराम ढांचे को बढ़ाएं

मुझे गहरा घोंसला वाले धारावाहिकों का एक सेट मिला है (~ 10 स्तर गहरे, कुल 20-30 मॉडल जो क्रमबद्ध हैं)। मैं संदर्भ में एक बुलियन ध्वज जोड़ने की कोशिश कर रहा हूं, जो यह निर्धारित करेगा कि धारावाहिक आउटपुट पदानुक्रम विस्तृत किया जाएगा (सभी मॉडल के फ़ील्ड शामिल करें) या मूल (केवल फ़ील्ड का हिस्सा)।

मैं निम्नलिखित कोड (आंशिक स्निपेट) ने लिखा:

from rest_framework import serializers 
from app.models import Institute, Department, Member 

class MemberSerializer(serializers.ModelSerializer): 
    def get_fields(self): 
     fields = super(MemberSerializer, self).get_fields() 
     if self.context['basic_view']: 
      for field in ['height', 'weight']: 
       del fields[field] 
     return fields 

    class Meta: 
     model = Member 
     fields = ('id', 'birth_date', 'height', 'weight') 


class DepartmentSerializer(serializers.ModelSerializer): 
    members = MemberSerializer(many=True, read_only=True) 

    def get_fields(self): 
     fields = super(DepartmentSerializer, self).get_fields() 
     if self.context['basic_view']: 
      for field in ['type', 'manager']: 
       del fields[field] 
     return fields 

    class Meta: 
     model = Department 
     fields = ('id', 'name', 'type', 'manager', 'members') 


class InstituteSerializer(serializers.ModelSerializer): 
    departments = DepartmentSerializer(many=True, read_only=True) 

    def get_fields(self): 
     fields = super(InstituteSerializer, self).get_fields() 
     if self.context['basic_view']: 
      for field in ['name', 'type']: 
       del fields[field] 
     return fields 

    class Meta: 
     model = Institute 
     fields = ('id', 'name', 'type', 'departments') 

def get_entities(is_basic_view): 
    institutes_list = Institute.objects.all() 

    serializer = InstituteSerializer(institutes_list, many=True, read_only=True, context={'basic_view': is_basic_view}) 

    return serializer.data 

लेकिन फिर पता चला कि 'संदर्भ' कि 'InstituteSerializer' को 'get_entities' से पारित हो जाता है पारित कर दिया-ऑन नहीं है नेस्टेड serializers को । मतलब है कि उपर्युक्त उदाहरण में - इंस्टीट्यूट सर्राइज़र के पास 'संदर्भ' में 'basic_view' है, लेकिन सदस्य Serializer & विभाग Serializer नहीं है।

मुझे context in nested serializers django rest framework में एक समाधान समाधान मिला: प्रतिस्थापन फ़ील्ड (जैसे 'विभाग'), और संदर्भ में मैन्युअल रूप से पास करने के लिए 'get_' विधि में SerializerMethodField का उपयोग करने के लिए। उस समाधान के साथ मेरी समस्या यह है कि इसे मेरे कोड में 20-30 बार एम्बेड करने की आवश्यकता है, अंत में स्रोत लाइनों की संख्या दोगुनी हो जाती है।

मेरा अनुरोध - अगर किसी के पास serializers के लिए एक एक्सटेंशन है (या कार्यान्वित करने में मदद कर सकता है)। मॉडल सेरियलाइज़र, जो निर्माण पर एक अतिरिक्त पैरामीटर प्राप्त करेगा, उदाहरण के लिए 'Inherit_context'।

class InstituteSerializer(serializers.ModelSerializer): 
    departments = DepartmentSerializer(many=True, read_only=True, inherit_context=True) 

    def get_fields(self): 
     fields = super(InstituteSerializer, self).get_fields() 
     if self.context['basic_view']: 
      for field in ['name', 'type']: 
       del fields[field] 
     return fields 

    class Meta: 
     model = Institute 
     fields = ('id', 'name', 'type', 'departments') 
+0

शायद मुझे अच्छी तरह से समझ में नहीं आ रहा है, लेकिन आप बस उस संदर्भ पर क्यों नहीं जाते? जैसे 'विभागों = विभागसेरियलाइज़र को कॉल करना (कई = सही, read_only = सही, संदर्भ = self.context)' 'इंस्टीट्यूटसेरियलाइज़र 'से पहले संदर्भ के साथ? – C14L

+0

@ सी 14 एल यह संभव नहीं है क्योंकि 'स्वयं' इस बिंदु पर एक अनसुलझा संदर्भ है –

उत्तर

8

जाहिर है मैं कुछ याद किया 'संदर्भ' है ...: तो केवल एक चीज मैं 'InstituteSerializer' में उदाहरण के लिए, मेरी कक्षा में बदलने की ज़रूरत होगी, उस पैरामीटर के अलावा है पहले से ही नेस्टेड serializers करने के लिए नीचे ...

हालांकि, कारण यह मेरे लिए काम नहीं किया विरासत में मिला है, (क्योंकि मेरे घोंसले के भाग के रूप, बच्चे serializers के कुछ serializers.SerializerMethodField के माध्यम से परिभाषित किया गया है) । और जैसे (केवल!) संदर्भ स्वचालित रूप से विरासत में नहीं है।

समाधान बस गुजारें-ऑन करने के लिए 'संदर्भ', 'मिलता है _...' प्रत्येक SerializerMethodField से संबंधित विधि के भीतर है:

class ParentSerializer(serializers.ModelSerializer): 
    child = serializers.SerializerMethodField() 

    def get_child(self, obj): 
     child = .... 
     serializer = ChildSerializer(instance=child, context=self.context) 
     return serializer.data 

पुनश्च - मेरा के समान एक डीआरएफ GitHub मुद्दे को एक बनाया गया था जबकि पहले: https://github.com/tomchristie/django-rest-framework/issues/2555

संबंधित मुद्दे