#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
и свои данные запроса?