Фреймворк Django Rest | Ошибка типа: Поле «идентификатор» ожидало номер, но получило заказ ([(«имя», «строка»)])

#python #django #typeerror #manytomanyfield

Вопрос:

Я пытаюсь обновить ManyToManyField в файле пользователя, который является частью моей пользовательской модели пользователя в моем API Django REST. Однако я получаю эту ошибку: 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() обновить навыки пользователя. Модель и сериализатор навыков определены ниже:

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 просто принимает упорядоченный запрос из запроса PUT, но я должен передать эти данные в экземпляр навыков. Правильно ли это? Как я могу изменить эту строку, чтобы исправить эту ошибку?

Комментарии:

1. Можете ли вы показать UserProfileSerializer и свои данные запроса?