0
votes

i'm relatively new to Django & DRF, i created a serializer and defined an update method to override the default one, but when i test it in postman it returns just the strings in user data, code sample below.

'serializers.py'

class UserSerializer(ModelSerializer):
class Meta:
    model = User
    fields = ['username', 'first_name', 'last_name', 'email', 'password']

class AgentSerializer(ModelSerializer): user = UserSerializer()

class Meta:
    model = Agent
    fields = ['user', 'phone', 'company']

def create(self, validated_data):
    user = validated_data.pop('user')
    new_user = User.objects.create(**user)
    agent = Agent.objects.create(user=new_user, company=validated_data['company'], phone=validated_data['phone'])
    return agent

def update(self, instance, validated_data):
    user = validated_data.pop('user')
    user = instance.user
    user.username = ['username']
    user.first_name = ['first_name']
    user.last_name = ['last_name']
    user.email = ['email']
    user.password = ['password']
    user.save()
    validated_data['user'] = User.objects.get(id=user.id)
    return super(AgentSerializer, self).update(instance, validated_data)

'postman test'

{"user": { "username":"testusername", "first_name": "testfirstname", "last_name":"testlastname", "email":"[email protected]", "password": "secret" }, "phone":"1111", "company":"1"}

'postman result'

"user": {
    "username": "['username']",
    "first_name": "['first_name']",
    "last_name": "['last_name']",
    "email": "['email']",
    "password": "['password']"
},
"phone": 1111,
"company": 1

What im i doing wrong?

1

1 Answers

0
votes

The problem is, you're assigning lists as values to the fields in the user model instead of grabbing values for the validated data. You'll want to replace this:

    user = validated_data.pop('user')
    user = instance.user
    user.username = ['username']
    user.first_name = ['first_name']
    user.last_name = ['last_name']
    user.email = ['email']
    user.password = ['password']
    user.save()

with:

    validated_user = validated_data.pop('user')
    user = instance.user
    user.username = validated_user['username']
    user.first_name = validated_user['first_name']
    user.last_name = validated_user['last_name']
    user.email = validated_user['email']
    user.password = validated_user['password']
    user.save()