Django Rest Framework | TypeError: Поле 'id' ожидало число, но получило OrderedDict([('name', 'string')])

Я пытаюсь обновить поле ManyToManyField в UserProfile, которое является частью моей пользовательской модели User в моем Django REST API. Однако я получаю эту ошибку: TypeError: Field 'id' expected a number but got OrderedDict([('name', 'string')])

Поскольку я делаю это в методе update() в моем UserSerializer, у меня уже есть созданный экземпляр.

account/serializers.py

class UserSerializer(serializers.ModelSerializer):
    password = serializers.CharField(
        max_length=68, min_length=6, write_only=True)
    userprofile = UserProfileSerializer(write_only=True)

    class Meta:
        model = User
        fields = ['email', 'username', 'password', 'tokens', 'userprofile']
        # Read-only b/c doesn't need any validating parameters
        read_only_fields = ['tokens']

    def update(self, instance, validated_data):
        """Perform an update on User"""
        # Remove password field b/c we don't want to iterate over it in the
        # validated_data dictionary. Django will salt/hash it.
        validated_data.pop('password', None)
        profile_data = validated_data.pop('userprofile', {})
        skills = profile_data.pop('skills', [])

        for (key, value) in validated_data.items():
            # Set remaining keys in the user
            setattr(instance, key, value)

        instance.save()

        for (key, value) in profile_data.items():
            setattr(instance.userprofile, key, value)

        for skill in skills:
            instance.userprofile.skills.add(skill)

        instance.userprofile.save()

        return instance

Ошибка возникает, когда я вызываю add() для обновления навыков пользователя. Модель и сериализатор для Skill определены ниже:

user_profile/models.py

class Skill(models.Model):
    name = models.CharField(max_length=120)

    def __str__(self):
        return self.name

user_profile/serializers.py

class SkillSerializer(serializers.ModelSerializer):
    class Meta:
        model = Skill
        fields = '__all__'

Мое первое предположение заключается в том, что переменная skill в цикле for просто принимает OrderedDict из запроса PUT, но я должен передать эти данные в экземпляр Skills. Правильно ли это? Как я могу изменить эту строку, чтобы исправить эту ошибку?

Вернуться на верх