2015-12-15 8 views
6

मेरे पास एक माता-पिता और एक से एक संबंधित बाल मॉडल है और मैं मूल प्रतिनिधित्व (read only) में बच्चे के फ्लैट से फ़ील्ड प्रस्तुत करना चाहता हूं। वर्तमान में, मैंने इसे कस्टम to_representation कार्यान्वयन के साथ हासिल किया है लेकिन यह बहुत शामिल है और मुझे आश्चर्य है कि इसे प्राप्त करने का कोई आसान तरीका नहीं है।Django आराम फ्रेमवर्क flatten नेस्टेड ऑब्जेक्ट का प्रतिनिधित्व

यह इस तथ्य से अधिक जटिल बना दिया गया है कि मेरा संबंधित मॉडल किसी संपत्ति के माध्यम से जुड़ा हुआ है।

तो यहाँ

ठोस उदाहरण है: डिफ़ॉल्ट रूप से एक संबंधित वस्तु की तरह गाया किया जाएगा:

{ 
    parent_name:'Bob', 
    child:{ 
    name:'Alice' 
    } 
} 

यह जो मैं चाहता है और वर्तमान में मेरे to_representation साथ मिलती है:

{ 
    parent_name:'Bob',  
    child_name:'Alice' 
} 

मेरे मॉडल इस तरह दिखें:

class ChildModel(models.Model): 
    name = models.CharField(max_length=100, null=True) 

class ParentModel(models.Model): 
    name = models.CharField(max_length=100, null=True) 
    _child = models.ForeignKey('ChildModel', null=True) 

    @property 
    def child(self): 
     return self._most_recent_status 

    @name.setter 
    def child(self, value): 
     self._child = value 

यहां मेरे सीरियललाइज़र हैं:

class FlatChildField(serializers.RelatedField): 
    def to_representation(self, value): 
     return value.name 


class FlatParentSerializer(serializers.ModelSerializer):  
    parent_name = serializers.CharField(source='name', read_only=True) 
    child_name = FlatChildField(source='_child', read_only=True) 

    class Meta: 
     model = Parent 
     fields = ('name', 'child_name') 

संबंधित मॉडलों का एक फ्लैट प्रतिनिधित्व प्राप्त करने के लिए एक सरल समाधान के लिए मैं आभारी रहूंगा।

पूर्णता के लिए, मुझे यह जानने में दिलचस्पी होगी कि "सामान्य" संबंधित मॉडल (यानी संपत्ति मॉडल फ़ील्ड भी नहीं) के लिए एक आसान समाधान है या नहीं। मैं related_model__field के django मॉडल क्वेरी सिंटैक्स के समतुल्य की तलाश में था, लेकिन मुझे वह नहीं मिला। क्या यह django आराम ढांचे के लिए मौजूद है?

बहुत धन्यवाद

उत्तर

13

सबसे सरल साधन का उपयोग करने के लिए किया जाएगा source:

class FlatParentSerializer(serializers.ModelSerializer):  
    parent_name = serializers.CharField(source='name', read_only=True) 
    child_name = serializers.CharField(source='_child.name', read_only=True) 

class Meta: 
    model = Parent 
    fields = ('name', 'child_name') 
+0

यह बहुत काम करता है, धन्यवाद। –

+0

यह read_only के बिना भी काम करता है, जो नेस्टेड मॉडल को फ़्लैट करने के लिए बहुत अच्छा है! – alekwisnia

3

आप SerializerMethodField उपयोग कर सकते हैं, यह आप वास्तव में बहुत काम की बचत होती है और यह बहुत साफ है और तुच्छ है:

class FlatParentSerializer(serializers.ModelSerializer):  
    parent_name = serializers.CharField(source='name', read_only=True) 
    child_name = serializers.SerializerMethodField('get_child_name') 

    class Meta: 
     model = Parent 
     fields = ('name', 'child_name') 

    def get_child_name(self, obj): 
     return obj._child.name 
संबंधित मुद्दे