Изменение поля Django с использованием только строки в качестве ключа
Я хочу изменить данные поля Django, используя только строку в качестве ключа.
Пример:
person = Person.objects.get(pk=1)
person['name'] = 'John'
person.save()
Мой код:
changes: dict[str, Any] = json.loads(request.body)
user: User = User.objects.get(id=user_id)
for key in changes.keys():
user[key] = changes.get(key)
user.save()
response = json.dumps([{ 'Success' : 'User changed successfully!'}])
return HttpResponse(response, content_type='application/json')
Я получаю следующее сообщение об ошибке:
TypeError: объект 'User' не поддерживает присвоение элементов
Как я должен это сделать?
Спасибо!
Вы хотите использовать setattr:
for key in changes.keys():
setattr(user, key, changes.get(key))
user.save()
Вы можете использовать **<dict_name>
(распаковку словаря) для обновления значений полей модели на месте:
User.objects.filter(id=user_id).update(**changes)
Вы также можете указать updated_fields
при сохранении объекта в дополнение к другим ответам:
updated_fields = []
for key, value in changes.items():
if hasattr(user, key):
setattr(user, key, value)
updated_fields.append(key)
user.save(update_fields=updated_fields)