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