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:
Comments
Post a Comment