2015-01-08 16 views
5

में पैरेंट ऑब्जेक्ट प्राप्त कर सकते हैं मैं अपने TrackSerializer में अब इस मॉडलकैसे मैं Django बाकी ढांचे serializer

class Track(models.Model): 
    album = models.ForeignKey(Album) 

है मैं एल्बम के नाम करना चाहते हैं।

class TrackSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Track 
     fields = ('album__name') 

इसका काम नहीं कर रहा

मुझे लगता है कि के लिए AlbumSerializer घोषित करने के लिए नहीं करना चाहती। क्या नया सीरियलाइज़र

+1

आप अपने TrackSerializer पर केवल 'गहराई = 1' सेट कर सकते हैं। यह स्वचालित रूप से पैरेंट मॉडल – toast38coza

उत्तर

10

आप ऐसा कर सकते हैं एक क्षेत्र बनाने के द्वारा: एक टपल के रूप में यह घोषणा करने के लिए, इसके बाद एक अल्पविराम जोड़ने के लिए, इस तरह।

विशेषता का नाम जो फ़ील्ड को पॉप्युलेट करने के लिए उपयोग किया जाएगा। एक विधि हो सकती है जो केवल एक स्वयं तर्क लेता है, जैसे कि URLField ('get_absolute_url'), या ईमेलफ़िल्ल्ड (स्रोत = 'user.email') जैसे ट्रैवर्स विशेषताओं के लिए बिंदीदार नोटेशन का उपयोग कर सकता है।

तो आपके मामले में, अपने क्षेत्र कस्टम source साथ जोड़ा जा करने की आवश्यकता होगी (इस मामले में album_name)

class TrackSerializer(serializers.ModelSerializer): 
    album_name = serializers.CharField(read_only=True, source="album.name") 

    class Meta: 
     model = Track 
     fields = ('album_name",) 

यह सेट कुंजी album_name के तहत उत्पादन में एल्बम का नाम शामिल होंगे।

+0

में एल्बम__नाम को पार नहीं कर सकता, बाकी दस्तावेज़ों के लिए लिंक भेज सकता है जहां यह कहता है कि हम 'album.name' वाक्यविन्यास के साथ peoperties तक पहुंच सकते हैं, मैं नहीं कर सका इसे – user3214546

+0

"विशेषता का नाम ... या ईमेलफिल्ड (स्रोत = 'user.email') जैसे ट्रैवर्स विशेषताओं के लिए बिंदीदार नोटेशन का उपयोग कर सकते हैं।" 'स्रोत' तर्क –

+0

के तहत, मैंने जो लिंक शामिल किया था, उससे सीधे मुझे खेद है कि मैंने यह नहीं देखा – user3214546

-2

को बिना किसी निर्णय के ऐसा करने का कोई तरीका है, आपको लगता है कि आपको Serializer relations की आवश्यकता है।

यह भी बहुत ही इस के लिए इसी तरह एक सवाल प्रतीत होता है पहले से ही कहा गया है:

def create_serializer(target_class, fields): 
    class ModelSerializer(serializers.ModelSerializer): 

     class Meta: 
      model = target_class 
      fields = fields 

    return ModelSerializer 

तो, एक ट्रैक serializer कर सकते हैं: django rest framework view does'nt show related table data

+0

को क्रमबद्ध करेगा, मुझे लगता है कि उदाहरण दस्तावेज़ पृष्ठ पर दिया गया है, एल्बमों में स्ट्रिंगसंबंधित फ़ील्ड के साथ ट्रैक हैं, मैं ट्रैक को एल्बम प्राप्त करना चाहता हूं। डॉक्स – user3214546

0

आप इसे इस तरह से (अजगर गतिशीलता का इस्तेमाल कर रही) कर सकते हैं इस दृष्टिकोण का उपयोग कर बनाया जा: इसके अलावा

TrackSerializer = create_serializer(Track, ('album__name',)) 

, ('album__name') है, जो एक बीच में लिखना है की सावधान रहना होगा डी स्ट्रिंग अभिव्यक्ति और tuple जैसा कि आप शायद इरादा नहीं है। अपने TrackSerializer कि has a custom source कि एल्बम का नाम पुन: प्राप्त करता पर

fields = ('album__name',) 
+0

एल्बम__नाम में दिखाया गया है कि जो भी दिखाया गया है, वह फ़ील्ड नाम के रूप में काम नहीं कर रहा है। यह मैं अपने प्रश्न में क्या पूछ रहा था। आपने सेरिलाइज़र फैक्ट्री बनाने का तरीका हल कर लिया है लेकिन मूल समस्या अभी भी रीमियन है कि मैं serilaizer – user3214546

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