python - Django REST framework: Update gives error with nested serializer -


i have 2 models

auth user model , userprofile

useprofile is:

class userprofile(models.model):     user = models.onetoonefield(user, related_name='profile')     name = models.charfield(_lazy(u'name'), max_length=255) 

for using these serializers:

from rest_framework import serializers django.contrib.auth.models import user  oneanddone.users.models import userprofile      class userprofileserializer(serializers.modelserializer):          class meta:             model = userprofile             fields = ('name',)       class userserializer(serializers.modelserializer):         profile = serializers.relatedfield()          class meta:             model = user             fields = ('id', 'username', 'email', 'groups', 'profile') 

the views both serializers are:

class userlistapi(generics.listcreateapiview):     """     api endpoint used complete list of users     , create new user.     """     queryset = user.objects.all()     serializer_class = userserializer   class userdetailapi(generics.retrieveupdatedestroyapiview):     """     api endpoint used get, update , delete user data.     """     queryset = user.objects.all()     serializer_class = userserializer     lookup_field = 'email' 

the nested serializer works fine create/delete queries update query like:

pdata = {"username":"testusername", "email":"test@testmail.com","profile":[{"name":"changed name"}]}  requests.patch('http://localhost:8000/api/v1/user/test@testmail.com/',data=json.dumps(pdata), headers={'authorization':'token bd876bfa04843c6ce1b82c84e27cd510f68dfbbd','content-type': 'application/json'}).text 

i error saying 'userprofile' object not iterable. traceback: http://pastebin.com/ra7jwfua

can update done nested serializer ? please give custom code have add make work.

i got working making following changes serializers , views.

serializers both models:

from django.contrib.auth.models import user  rest_framework import serializers  oneanddone.users.models import userprofile   class userprofileserializer(serializers.modelserializer):      class meta:         model = userprofile         fields = ('name', 'username', 'privacy_policy_accepted')   class userserializer(serializers.modelserializer):     profile = userprofileserializer(required=false, many=false)      class meta:         model = user         fields = ('id', 'username', 'email', 'groups', 'profile') 

views both serializers:

class userdetailapi(generics.retrieveupdatedestroyapiview):     """     api endpoint used get, update , delete user data.     """     lookup_field = 'email'     queryset = user.objects.all()     serializer_class = userserializer   class userlistapi(generics.listcreateapiview):     """     api endpoint used complete list of users     , create new user.     """     queryset = user.objects.all()     serializer_class = userserializer 

and update query can written on similar lines like:

# change profile data(name, username, privacy_policy_accepted)         changed_data = {'username': 'testname', 'email': 'test@test.com',                         'profile': {'name': 'changed test name', 'username': 'testname123', 'privacy_policy_accepted': false}}         response = self.client.patch(user_uri, changed_data, format='json') 

disclaimer: these code snippets part of application under mozilla organization , released under mozilla license.

links original code can found here:

serializers , views , unit tests profile update


Comments

Popular posts from this blog

php - render data via PDO::FETCH_FUNC vs loop -

c++ - OpenCV Error: Assertion failed <scn == 3 ::scn == 4> in unknown function, -

The canvas has been tainted by cross-origin data in chrome only -