2015-10-20 3 views
7

Django-REST-Framework का उपयोग करते समय, मैं चयनित फ़ील्ड को नेस्टेड धारावाहिक ऑब्जेक्ट में प्रदर्शित करने में सक्षम नहीं हूं।डीजेगो रेस्ट फ्रेमवर्क - नेस्टेड सीरियलाइजेशन अपेक्षित काम नहीं कर रहा है

मैं सही ढंग से Address मॉडल की सम्पूर्णता को क्रमानुसार करने में सक्षम हूँ, लेकिन मैं Address से केवल कुछ ही क्षेत्रों, मेरे धारावाहिक Outlet में नेस्ट चाहते हैं। जब serializer OutletSerializer पर क्षेत्र outlet_address के लिए एक मूल्य प्राप्त करने का प्रयास एक

गॉट AttributeError नहीं है। धारावाहिक फ़ील्ड को गलत तरीके से नामित किया जा सकता है और Outlet उदाहरण पर किसी भी विशेषता या कुंजी से मेल नहीं खाता है। मूल अपवाद टेक्स्ट था: 'आउटलेट' ऑब्जेक्ट में 'आउटलेट_ड्रेस' कोई विशेषता नहीं है।

api_v1/models.py

class Address(models.Model): 
    building = models.CharField(_("shop number, floor & building"), max_length=128) 
    street = models.CharField(_("street"), max_length=128, blank=True) 
    area = models.ManyToManyField(Area, related_name='address') 
    city = models.ForeignKey(City, related_name='address') 
    pin_code = models.CharField(_("PIN code"), max_length=6, default="") 

    def __unicode__(self): 
     return self.building + " " + self.street + " ..." 


class Outlet(models.Model): 
    name = models.CharField(max_length=100, blank=True) 
    chain = models.ForeignKey(Chain, related_name='outlet', blank=True, null=True) 
    organization = models.ForeignKey(Organization, blank=True, null=True) 
    address = models.OneToOneField(Address, related_name='outlet_address') 
    thumbnail = AjaxImageField(upload_to='thumbnails', 
           max_height=200, #optional 
           max_width=200, # optional 
           crop=True) # optional 
    date_created = models.DateTimeField(_('date created'), default=timezone.now) 

    def __unicode__(self): 
     return self.name 

api_v1/serializers.py

from rest_framework import serializers 
from api_v1.models import Outlet, Address 

class AddressSerializer(serializers.ModelSerializer): 
    #address_area = AreaSerializer(many=False) 

    class Meta: 
     model = Address 
     fields = ('building', 'street',) 
     depth = 3 


class OutletSerializer(serializers.ModelSerializer): 
    outlet_address = AddressSerializer(many=False) 
    #area = serializers.CharField(source='address.area') #multiple levels of nesting? 

    class Meta: 
     model = Outlet 
     fields = ('id', 'name', 'thumbnail', 'outlet_address') 
     # fields = ('id', 'name', 'thumbnail', 'address') # this works 
     depth = 3 

इस बिंदु पर, यह आउटलेट मॉडल में outlet_address विशेषता खोजने में असमर्थ है जबकि मुझे उम्मीद है कि यह धारावाहिक में सक्षम होना चाहिए।

गॉट AttributeError जब serializer OutletSerializer पर क्षेत्र outlet_address के लिए एक मूल्य प्राप्त करने का प्रयास। Serializer फ़ील्ड को गलत तरीके से नामित किया जा सकता है और Outlet उदाहरण पर किसी भी विशेषता या कुंजी से मेल नहीं खाता है। मूल अपवाद टेक्स्ट था: 'आउटलेट' ऑब्जेक्ट में कोई आउटलेट 'आउटलेट_ड्रेस' नहीं है।

अन्य उत्तर पर बताया गया है, मैं कोशिश की है:

  1. सभी मॉडल

उत्तर

9

इस प्रयास करें:

from rest_framework import serializers 
from api_v1.models import Outlet, Address 

class AddressSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Address 
     fields = ('building', 'street',) 
     depth = 3 


class OutletSerializer(serializers.ModelSerializer): 
    address = AddressSerializer(many=False) # make it address, not outlet_address 

    class Meta: 
     model = Outlet 
     fields = ('id', 'name', 'thumbnail', 'address') # make this address as well, not outlet_address 
     depth = 3 

कारण मैं ऊपर परिवर्तन कर होता है क्योंकि आउटलेट मॉडल एक विशेषता "outlet_address" कहा जाता है नहीं है, इसमें "पता" नामक एक विशेषता है।

ने वही समस्या के लिए यहाँ देखें: Django Rest framework keeps returning error on nested relationship

+0

मैंने किया था जुड़ा हुआ लेख पहले देखते हैं, लेकिन यह पिछड़े संबंधों के लिए किया गया था। आपका जवाब काम करता है पूरी तरह से और अब भी मैं डीआरएफ जादू को थोड़ा बेहतर समझता हूं। धन्यवाद! – Pranab

3

मॉडल आउटलेट एक "पता" क्षेत्र है करने के लिए ModelSerializer

  • जोड़ने related_name= को many= जोड़ने, आउटलेट_ड्रेस नहीं। मैं इस तरह अपने serializer स्थापित करने के लिए सलाह देंगे:

    class OutletSerializer(serializers.ModelSerializer): 
        address = AddressSerializer(many=False) 
    
        class Meta: 
         model = Outlet 
         fields = ('id', 'name', 'thumbnail', 'address') 
         depth = 2 
    
  • 7

    इसके अतिरिक्त अन्य उत्तर देने के लिए, मैं जोड़ने के लिए मामला किसी में निम्नलिखित यहाँ भी भूमि चाहते हैं।

    नेस्टेड धारावाहिकरण के लिए क्षेत्र के नाम को मॉडल फ़ील्ड में काम करने के लिए आवश्यक है।

    यदि हमें reverse relation की आवश्यकता है, तो जाहिर है मॉडल मॉडल में ऐसा कोई क्षेत्र नहीं होगा।

    उदाहरण के लिए, प्रश्न के विशेष मॉडल के साथ, ऐसा होगा यदि हमें पता serializer में सभी आउटलेट का संदर्भ देने की आवश्यकता है।

    इसलिए हमें यह करना होगा: (ए) या तो अन्य मॉडल की विदेशी कुंजी पर related_name निर्दिष्ट करें। यह वह जगह है जहां हम outlet_address का उपयोग करेंगे, क्योंकि यह आउटलेट मॉडल में पता फ़ील्ड का संबंधित नाम है।

    या (ख) अगर कोई संबंधित नाम तो डिफ़ॉल्ट Django नाम का उपयोग, मॉडल का नाम लिए _set जोड़कर (उदाहरण के लिए outlet_set

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