2014-12-18 16 views
5

Serializer:Django बाकी ढांचे नेस्ट serializer आंशिक अद्यतन

class ProfileSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = UserProfile 
     fields = ('foo', 'bar') 


class UserSerializer(serializers.ModelSerializer): 
    userprofile = ProfileSerializer(partial=True) 

    class Meta: 
     model = User 
     fields = ('username', 'password', 'email', 'userprofile') 

    def create(self, validated_data): 
     profile_data = validated_data.pop('userprofile') 
     user = User.objects.create(**validated_data) 
     UserProfile.objects.create(user=user, **profile_data) 

     return user 

    def update(self, instance, validated_data): 
     profile_data = validated_data.pop('userprofile') 
     profile = instance.userprofile 

     instance.username = validated_data.get('username', instance.username) 
     instance.email = validated_data.get('email', instance.email) 
     instance.save() 

     profile.foo = profile_data.get('foo', profile.foo) 
     profile.bar = profile_data.get('bar', profile.bar) 
     profile.save() 

     return instance 

दृश्य:

class UsersViewSet(viewsets.ModelViewSet): 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 
    authentication_classes = (TokenAuthentication,) 
    permission_classes = (IsAuthenticated,) 

दोनों बना सकते हैं और अद्यतन ठीक काम कर रहे हैं, समस्या आंशिक अद्यतन के साथ है। django उपयोगकर्ता मॉडल के रूप में आवश्यक उपयोगकर्ता नाम है और मैं इसे वैकल्पिक बनाना चाहता हूं। क्या इस परिदृश्य के लिए आंशिक अद्यतन सक्षम करने का कोई तरीका है?

उदाहरण के लिए मैं सिर्फ "foo" के साथ PUT के साथ अपडेट करना चाहता हूं।

def get_serializer(self, instance=None, data=None, many=False, partial=False): 
     """If request is not PUT, allow partial updates.""" 
     if self.request.method == 'PUT': 
      return UserSerializer(instance=instance, data=data, many=many, partial=True) 
     else: 
      return UserSerializer(instance=instance, data=data, many=many, partial=partial) 

यह सच है के लिए आंशिक मजबूर करता है, तो request.method डाल दिया जाता है:

उत्तर

5

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

व्यक्तिगत रूप से मुझे लगता है कि यह थोड़ा अजीब है कि यह कैसे काम करता है, PUT को उन सभी तर्कों की आवश्यकता होती है जो वैकल्पिक नहीं हैं, लेकिन वैकल्पिक तर्क अकेले छोड़ देंगे। इसलिए आप वैकल्पिक वैकल्पिक तर्कों को अकेले छोड़कर वैकल्पिक तर्क संपादित कर सकते हैं लेकिन आवश्यक तर्कों के साथ ऐसा नहीं कर सकते हैं (मेरा मतलब है कि आप स्पष्ट रूप से केवल मौजूदा मानों की आपूर्ति कर सकते हैं, लेकिन यदि आप संपादन कर रहे थे तो वे बदले गए हैं और आप उन्हें मजबूर कर देंगे वापस)। पैच मेरे लिए बहुत अधिक समझ में आता है। आपके द्वारा आपूर्ति की जाने वाली कोई भी तर्क बदली जाएगी, और कोई भी आप नहीं करेंगे। आईएमओ पुट को किसी भी वैकल्पिक तर्क को मिटा देना चाहिए जो आपूर्ति नहीं की जाती है, ताकि यह केवल एक प्रतिस्थापन और अद्यतन (PUT) वैकल्पिक के बजाय एक वास्तविक प्रतिस्थापन हो।

4

मैं UsersViewSet अंदर get_serializer अधिभावी समाप्त हो गया। सुनिश्चित नहीं है कि यह सबसे सुंदर समाधान है लेकिन यह काम करता है। किसी भी एक एक बेहतर समाधान कृपया शेयर :)

1

वास्तव में, निम्नलिखित कोड पहले से ही आंशिक अद्यतन का समर्थन करता है करना है:

instance.username = validated_data.get('username', instance.username) 

यह 'मिल' समारोह 'उपयोगकर्ता नाम' मिल जाएगा क्षेत्र से मान्य_डेटा। यदि यह अस्तित्व में नहीं था, तो example.username वापस कर दिया जाएगा।

1

उपयोगकर्ता seriliazer तरह

username = fields.CharField(required=False) 
संबंधित मुद्दे