2013-10-18 13 views
7

हम एक एपीआई बना रहे हैं जिसे उपयोगकर्ता को रिकॉर्ड अपडेट करने की अनुमति देने की आवश्यकता है। कई मामलों में, एक स्थिति अद्यतन या नाम परिवर्तन की तरह, केवल एक फ़ील्ड बदल जाएगा। यह एक पैच अनुरोध के लिए उपयुक्त उपयोग-केस परिदृश्य प्रतीत होता है। जैसा कि मैं समझता हूं कि यह एक 'आंशिक' अद्यतन है।Django REST Framework पैच आवश्यक फ़ील्ड पर विफल रहता है

हमने Django के आरईएसटी फ्रेमवर्क को लागू किया है और इस मुद्दे में भाग लिया है। "खाताउज़र" जैसे रिकॉर्ड के लिए मैं केवल नाम फ़ील्ड बदलना चाहता हूं इसलिए मैं निम्नलिखित अनुरोध भेजता हूं: पैच/एपीआई/उपयोगकर्ता/1/HTTP/1.1 होस्ट: लोकलहोस्ट एक्स-सीएसआरएफटीकेन: 111122223333444455556666 सामग्री-प्रकार : आवेदन/json; charset = UTF-8 कैश-नियंत्रण: नहीं कैश

{ "fullname": "John Doe" } 

रिकॉर्ड स्पष्ट रूप से इस तरह के 'खाता' जो एक नया के लिए आवश्यक है के रूप में 'से संबंधित' क्षेत्रों के एक जोड़े सहित अन्य गुण होते हैं रिकॉर्ड। अनुरोध जमा करते समय, प्रतिक्रिया निम्नलिखित शरीर के साथ एक 400 त्रुटि है: {"खाता": ["यह फ़ील्ड आवश्यक है।" ]} उपयोगकर्ता के लिए serializer इस तरह दिखता है:

class AccountUserSerializer(serializers.ModelSerializer): 
    account = serializers.PrimaryKeyRelatedField() 

class Meta: 
    model = AccountUser 
    fields = ('id', 'account', 'fullname', ...) 
    depth = 1 

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

class AccountUser(models.Model): 
    ''' Account User''' 
    fullname = models.CharField(max_length=200, 
     null=True,blank=True) 
    account = models.ForeignKey(Account, 
     on_delete=models.PROTECT 
     ) 

    objects = AccountUserManager() 

    def __unicode__(self): 
     return self.email 

    class Meta: 
     db_table = 'accounts_account_user' 

मैं यहाँ कुछ गलत कर रहा हूँ या है यह गलत अद्यतन करने के लिए सक्षम होने की अपेक्षा करने के लिए एक रिकॉर्ड पर एक ही क्षेत्र इस तरह से। धन्यवाद! यह समुदाय चट्टानों!

संपादित करें: का अनुरोध किया - AccountUserManager:

class AccountUserManager(BaseUserManager): 

    def create_user(self, email, account_name): 
     username = hash_email_into_username(email) 
     ... 
     account = Account.objects.get(name=account_name) 
     account_user = AccountUser(email=email,user=user,account=account) 
     account_user.save() 
     return account_user 
+0

एक' related_name जोड़ने का प्रयास करें = 'account'' देख सकते हैं, .. '' –

+0

Account' मॉडल पर रिवर्स लुकअप के लिए ही है यही कारण है कि। –

+0

कर सकते हैं आप अपना 'AccountUserManager' पोस्ट करते हैं? मुझे लगता है कि समस्या यह है कि प्रबंधक' pk = 1' पर ऑब्जेक्ट वापस नहीं कर रहा है और इसलिए आपके पैच कॉल (जिसे 'partial_update' कहते हैं) सोचता है कि इसे एक नया उदाहरण बनाने की आवश्यकता है। –

उत्तर

1

यह नहीं दिखता है अपने प्रबंधक उपयोगकर्ता फ़िल्टर कर रही है की तरह। मैं आपको पीडीबी का उपयोग करने और अपने व्यू कोड में ब्रेकपॉइंट सेट करने के लिए प्रोत्साहित करता हूं और यह देखने के लिए कदम उठाता हूं कि यह एक नया रिकॉर्ड बनाने का प्रयास क्यों कर रहा है। मैं झुका सकता हूं कि हम हर समय आंशिक अपडेट पूरा करने के लिए पैच का उपयोग करते हैं और बिना किसी समस्या के अपडेट करने के लिए केवल कुछ फ़ील्ड्स भेजते हैं।

केवल दूसरे सोचा है कि आप कुछ कैसे (null की तरह) account के लिए एक मूल्य भेजने है कि भले ही आप उदाहरण सूचीबद्ध कर रहे हैं केवल fullname क्षेत्र भेजने शो सत्यापन त्रुटि ट्रिगर कर रहे है।

0

आंशिक अपडेट के बारे में मेरे answer देखें। इसके अलावा, आप `models.ForeignKey (खाते में डीआरएफ docs और यह एक docs