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