2015-05-31 18 views
13

django तो मैं एक नेस्टेड serializer है:संदर्भ बाकी ढांचे

class ChildSerializer(ModelSerializer): 
    class Meta: 
     fields = ('c_name',) 
     model = Child 


class ParentSerializer(ModelSerializer): 

    child = ChildSerializer(many=True, read_only=True) 

    class Meta: 
     model = Parent 
     fields = ('p_name', 'child') 

और मुझे नेस्टेड serializer में संदर्भ का उपयोग करना चाहते हैं, मैं कैसे कर सकते हैं? जहां तक ​​मैं कह सकता हूं, संदर्भ बच्चे को पास नहीं किया गया है।

मैं खेतों पर प्रति उपयोगकर्ता अनुमति मॉडल) को लागू करने, उसके लिए मैं get_fields अधिरोहित (ModelSerializer की विधि सक्षम होना चाहते हैं:

def get_fields(self): 
    fields = super().get_fields() 
    .... 
    for f in fields: 
     if has_rights(self.context['request'].user, f, "read"): 
      ret_val[f] = fields[f] 
    .... 
    return ret_val 

कौन सा नियमित serializers के लिए काम करता है, लेकिन संदर्भ, और इस प्रकार अनुरोध और उपयोगकर्ता उपलब्ध नहीं हैं जब नेस्टेड बच्चा get_fields() पर पास हो जाता है। धारावाहिक को घोंसला के दौरान मैं संदर्भ का उपयोग कैसे करूं?

उत्तर

8

ठीक है मुझे एक कामकाजी समाधान मिला। मैंने पेरेंट क्लास में एक SerializerMethodField के साथ ChildSerializer असाइनमेंट को प्रतिस्थापित किया जो संदर्भ जोड़ता है।

class ChildSerializer(CustomModelSerializer): 
    class Meta: 
     fields = ('c_name',) 
     model = Child 


class ParentSerializer(CustomModelSerializer): 

    child = serializers.SerializerMethodField('get_child_serializer') 

    class Meta: 
     model = Parent 
     fields = ('p_name', 'child') 

    def get_child_serializer(self, obj): 
     serializer_context = {'request': self.context.get('request') } 
     children = Child.objects.all().filter(parent=obj) 
     serializer = ChildSerializer(children, many=True, context=serializer_context) 
     return serializer.data 

और मेरे CustomModelSerializer में:: यह तो मेरे CustomModelSerializer में get_fields विधि को पारित कर दिया है

class CustomModelSerializer(rest_serializer_classes.HyperlinkedModelSerializer): 

    def __init__(self, *args, **kwargs): 
     """ 
      Make sure a user is coupled to the serializer (needed for permissions) 
     """ 
     super().__init__(*args, **kwargs) 
     if not self.context: 
      self._context = getattr(self.Meta, 'context', {}) 
     try: 
      self.user = self.context['request'].user 
     except KeyError: 
      self.user = None 


    def get_fields(self): 
     ret = OrderedDict() 

     if not self.user: 
      print("No user associated with object") 
      return ret 

     fields = super().get_fields() 

     # Bypass permission if superuser 
     if self.user.is_superuser: 
      return fields 

     for f in fields: 
      if has_right(self.user, self.Meta.model.__name__.lower(), f, "read"): 
       ret[f] = fields[f] 

     return ret 

यह ठीक काम करने के लिए लगता है, और जब मैं या तो बच्चे के क्षेत्र serializer में छोड़ दिए जाते हैं Child.c_name पर या पर Parent.child-पढ़ने के अधिकारों को रद्द

2

आप serialziers.ListField बजाय उपयोग कर सकते हैं। ListField स्वचालित रूप से इसके बच्चे के संदर्भ को पास करता है। तो, आपका कोड

class ChildSerializer(ModelSerializer): 
    class Meta: 
     fields = ('c_name',) 
     model = Child 


class ParentSerializer(ModelSerializer): 
    child = serializers.ListField(read_only=True, child=ChildSerializer()) 

    class Meta: 
     model = Parent 
     fields = ('p_name', 'child') 
है
संबंधित मुद्दे