0
votes

I am facing one issue for updating models using django serializer.

Here is my models:

class User(models.Model):
    email = models.EmailField(unique=True)
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)


class UserProfile(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    designation = models.CharField(max_length=200, blank=True)
    contact_number = models.CharField(max_length=20, blank=True)
    team = models.CharField(max_length=200, blank=True)
    manager = models.CharField(max_length=200, blank=True)
    joining_date = models.DateField(default=datetime.now) 

I need to create a serializer for editing profile details of the current user. In this User details like designation, contact_number , team , manager, joining_date are in UserProfile model and te first_name and last_name are in User model .... At one edit both the models needs to get update

This is my serializer.

class UserSerializer(ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'first_name','last_name')


class UserProfileSerializer(ModelSerializer):

    user = UserSerializer()

    class Meta:
        model = UserProfile
        fields = ('id', 'designation', 'contact_number', 'team', 'manager',
              'joining_date','user')

    def update(self, instance, validated_data):
        user = validated_data.get('user')
        instance.user.first_name = user.get('first_name')
        instance.user.save()
        return instance

I am getting an error { "user": [ "This field is required." ] }

1

1 Answers

0
votes

Change user field to DictField. In this way, it will not be treated as foreignkey. In to_representation, serialize user object and you will get data in format in which you want to get.

class UserSerializer(ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'first_name','last_name')


class UserProfileSerializer(ModelSerializer):

    user = serializer.DictField(required=False, write_only=True, default={})

    def to_representation(self, instance):
        data = super().to_representation(instance)
        data.update({'user': UserSerializer(instance.user).data})
        return data

    class Meta:
        model = UserProfile
        fields = ('id', 'designation', 'contact_number', 'team', 'manager',
              'joining_date','user')

    def update(self, instance, validated_data):
        user = validated_data.get('user')
        instance.user.first_name = user.get('first_name')
        instance.user.save()
        return instance