2013-08-02 6 views
7

मैं एक Django मॉडल है कि इस तरह है:डीजेगो रेस्ट फ्रेमवर्क सीरियलाइज़र आउटपुट को कैसे अनुकूलित कर सकता है?

class WindowsMacAddress(models.Model): 
    address = models.TextField(unique=True) 
    mapping = models.ForeignKey('imaging.WindowsMapping', related_name='macAddresses') 

और दो serializers, के रूप में परिभाषित:

class WindowsFlatMacAddressSerializer(serializers.Serializer): 
    address = serializers.Field() 

class WindowsCompleteMappingSerializer(serializers.Serializer): 
    id = serializers.Field() 
    macAddresses = WindowsFlatMacAddressSerializer(many=True) 
    clientId = serializers.Field() 

जब एक दृश्य में serializer एक्सेस करते समय, मैं निम्नलिखित उत्पादन प्राप्त करें:

[ 
    { 
     "id": 1, 
     "macAddresses": [ 
      { 
       "address": "aa:aa:aa:aa:aa:aa" 
      }, 
      { 
       "address": "bb:bb:bb:bb:bb:bb" 
      } 
     ], 
     "clientId": null 
    } 
] 

लगभग अच्छा है, सिवाय इसके कि मैं यह पसंद करना चाहूंगा:

[ 
    { 
     "id": 1, 
     "macAddresses": [ 
      "aa:aa:aa:aa:aa:aa", 
      "bb:bb:bb:bb:bb:bb" 
     ], 
     "clientId": null 
    } 
] 

मैं इसे कैसे प्राप्त कर सकता हूं?

उत्तर

11

custom serializer field बनाएं और to_native लागू करें ताकि यह आपकी इच्छित सूची लौटा सके।

आप source="*" technique तो कुछ इस तरह काम कर सकते हैं का उपयोग करते हैं:

class CustomField(Field): 
    def to_native(self, obj): 
     return obj.macAddresses.all() 

मुझे आशा है कि मदद करता है।

+0

दिए गए सभी लिंक टूटे हैं, क्या आप इसे – vimal1083

+0

अपडेट कर सकते हैं। –

6

कार्लटन का जवाब काम ठीक काम करेगा। आपके द्वारा उठाए जा सकने वाले कुछ अन्य दृष्टिकोण भी हैं।

आप SlugRelatedField का भी उपयोग कर सकते हैं, जो लक्ष्य पर दिए गए क्षेत्र का उपयोग करके संबंधों का प्रतिनिधित्व करता है।

इसलिए उदाहरण के लिए

...

class WindowsCompleteMappingSerializer(serializers.Serializer): 
    id = serializers.Field() 
    macAddresses = serializers.SlugRelatedField(slug_field='address', many=True, read_only=True) 
    clientId = serializers.Field() 

वैकल्पिक रूप से, अगर WindowsMacAddress की __str__ बस पते को प्रदर्शित करता है, तो आप बस RelatedField इस्तेमाल कर सकते हैं, जो एक बुनियादी केवल पढ़ने के लिए क्षेत्र है कि आप एक दे देंगे संबंध लक्ष्य के सरल स्ट्रिंग प्रतिनिधित्व।

# models.py 
class WindowsMacAddress(models.Model): 
    address = models.TextField(unique=True) 
    mapping = models.ForeignKey('imaging.WindowsMapping', related_name='macAddresses') 

    def __str__(self): 
     return self.address 

# serializers.py 
class WindowsCompleteMappingSerializer(serializers.Serializer): 
    id = serializers.Field() 
    macAddresses = serializers.RelatedField(many=True) 
    clientId = serializers.Field() 

विभिन्न तरीकों से आप अपने एपीआई में रिश्तों का प्रतिनिधित्व कर सकते का एक बेहतर विचार प्राप्त करने के लिए documentation on serializer fields पर एक नज़र डालें।

+0

हम्म मैंने सोचा कि 'संबंधित फ़ील्ड' और 'स्लगरेलेटेड फ़ील्ड' केवल 'मॉडलसेरियलज़र' के साथ काम करते हैं? –

+0

सभी संबंधित क्षेत्र Django मॉडल संबंधों के साथ काम करते हैं। वे केवल 'सीरिएलाइज़र' या 'मॉडलसेरियलाइज़र' वर्ग पर उपयोग किए जाने वाले ठीक काम करेंगे। –

+0

धन्यवाद! यह बाद में मेरे लिए उपयोगी होगा। –

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