2016-04-07 12 views
12

मैं usign रहा हूँ Django बाकी फ्रेमवर्क जहाँ मैं निम्नलिखित दो serializers है:Django बाकी फ्रेमवर्क मॉडल क्रमांक क्षेत्र

class ServiceSerializer(serializers.ModelSerializer): 
    id = serializers.ReadOnlyField() 

    class Meta: 
     model = ServiceType 
     fields = ('id', 'serviceName', 'servicePrice') 


class CompanyShortListSerializer(serializers.ModelSerializer): 

    services = ServiceSerializer(many=True) 

    class Meta: 
     model = Company 
     fields = ('id','name','address','cost_per_patient','cost_per_month','renting_fee','services') 

ServiceType मॉडल इस तरह दिखता है:

class ServiceType(models.Model): 
    serviceName = EncryptedCharField(max_length=100, blank=True, verbose_name = "Typ usługi") 
    servicePrice = EncryptedFloatField(null=True, blank=True, verbose_name = "Cena usługi", validators = [MinValueValidator(0.1), MaxValueValidator(999)]) 
    company = models.ForeignKey(Company, related_name = 'services') 

मैं संबंधित सेवाओं को बदलकर मौजूदा उदाहरणों को अपडेट करना चाहते हैं (उदाहरण के लिए उनमें से कुछ को हटा देना)। इस लक्ष्य को पूरा मैं यह कर रहा हूँ: - मैं एक KeyError 'id' मिलता है जिसका अर्थ है - हालांकि मैं यह स्पष्ट रूप से ServiceSerializerid क्षेत्र में जोड़ा समस्या यह है कि मैं का सामना करना पड़ रहा हूँ

def update(self, instance, validated_data): 
    # Updates an exisitng Company with several services 
    instance.name = validated_data['name'] 
    instance.address = validated_data['address'] 
    instance.cost_per_patient = validated_data['cost_per_patient'] 
    instance.renting_fee = validated_data['renting_fee'] 
    services_data = validated_data['services'] 

    for item in services_data: 
     updatedService = ServiceType(
      serviceName = item['serviceName'], 
      servicePrice = item['servicePrice'], 
      id=item['id'], 
      company=instance) 
     updatedService.save() 

    return instance 

कि service['id'] क्षेत्र प्रदान नहीं की है है।

संपादित

यहाँ एक अनुकरणीय अनुरोध (क्रोम से लिया गया) है कि मैं पोस्टिंग कर रहा हूँ है:

{ "id":49,"name":"Test 1", 
    "address":"Testowa 1", 
    "renting_fee":200, 
    "cost_per_month":300, 
    "cost_per_patient":null, 
    "services":[ 
    {"id":67,"serviceName":"Terapia","servicePrice":100}, 
    {"id":68,"serviceName":"Terapia par","servicePrice":150}, 
    {"id":69,"serviceName":"Terapia po angielsku","servicePrice":120} 
    ] 
} 

क्या मैं गलत कर रहा हूँ और कैसे (एक एक वस्तु की आईडी प्राप्त करने मूल रूप से सर्विससेरियलाइज़र) नेस्टेड धारावाहिकों का उपयोग कर?

संपादित करें .2

जब मैं serializer अद्यतन समारोह मैं निम्नलिखित मिल से प्रिंट:

print(self.data['services']) मुझे देता है:

[ 
OrderedDict([('id', 67), ('serviceName', u'Terapia'), ('servicePrice', 100.0)]), 
OrderedDict([('id', 68), ('serviceName', u'Terapia par'), ('servicePrice', 150.0)]), 
OrderedDict([('id', 69), ('serviceName', u'Terapia po angielsku'), ('servicePrice', 120.0)]), 
OrderedDict([('id', 70), ('serviceName', u'Terapia grupowa'), ('servicePrice', 140.0)]) 
] 

हालांकि, print(services_data) निम्नलिखित देता है (मूल रूप से वही, लेकिन आईडी के बिना):

[ 
OrderedDict([(u'serviceName', u'Terapia'), (u'servicePrice', 100.0)]), 
OrderedDict([(u'serviceName', u'Terapia par'), (u'servicePrice', 150.0)]), 
OrderedDict([(u'serviceName', u'Terapia po angielsku'), (u'servicePrice', 120.0)]) 
] 
,210

और ids खो जाना ...

संपादित no.3

Django Rest Framework docs के अनुसार निश्चित क्षेत्र हो जाएगा serializer उत्पादन प्रतिनिधित्व में किया जाएगा यदि यह एक HiddenField होना चाहिए। हालांकि इसे default मान की आवश्यकता है ... मैंने इसे चेक किया है और वास्तव में एक डिफ़ॉल्ट मान 'हल' के साथ इस छिपे हुए फ़ील्ड का उपयोग कर रहा है - आईडी मान्य_डेटा में है। समस्या यह है कि id सही नहीं है। क्या इस id को धारावाहिक को भेजे गए ऑब्जेक्ट के मान पर सेट करने की संभावना है?

उत्तर

15

ठीक है - मुझे लगता है कि मुझे जवाब मिला ...ध्यान से the docs :)

पढ़ने तो the docs के अनुसार id क्षेत्र इस तरह की एक ModelField करने के लिए सेट किया जा सकता है:

id = serializers.ModelField(model_field=ServiceType()._meta.get_field('id')) 

दरअसल, इस लाइन id क्षेत्र को जोड़ने के बाद validated_data :)

+4

धन्यवाद, आपने मेरा दिन बचाया :-) – bre

+0

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

2

आपने को ReadOnlyField के रूप में सेट किया है। यही कारण है कि id मान्य डेटा में प्रकट नहीं होता है। बस इस लाइन को हटाएं:

id = serializers.ReadOnlyField() 
+0

दुर्भाग्य से, इस को हटाने मैं अभी भी 'KeyError 'आईडी' 'serializer से प्राप्त करने के बाद ... :( – user1544500

+0

कैसे JSON कि आप पोस्ट दिखता है आप को यह जोड़ सकते हैं अपने प्रश्न? – ilse2005

+0

मैंने क्रोम से एक अनुकरणीय अनुरोध जोड़ा है। मुझे आशा है कि यह पर्याप्त है? – user1544500

4
में मौजूद है

स्वीकार्य उत्तर काम करता है लेकिन अनावश्यक रूप से जटिल है। आप आईडी फ़ील्ड को केवल पढ़ने के लिए नहीं बदल सकते हैं। जैसे कुछ इस तरह करना होगा:

id = serializers.IntegerField(required=False) 
+0

दरअसल, यह भी काम करता है। –

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