Добавляя поверх других ответов, вот немного более безопасная версия, чтобы избежать путаницы со связанными полями:
def is_simple_editable_field(field):
return (
field.editable
and not field.primary_key
and not isinstance(field, (ForeignObjectRel, RelatedField))
)
def update_from_dict(instance, attrs, commit):
allowed_field_names = {
f.name for f in instance._meta.get_fields()
if is_simple_editable_field(f)
}
for attr, val in attrs.items():
if attr in allowed_field_names:
setattr(instance, attr, val)
if commit:
instance.save()
Он проверяет, что поле, которое вы пытаетесь обновить, доступно для редактирования, не является первичным ключом и не является одним из связанных полей.
Пример использования:
book = Book.objects.first()
update_from_dict(book, {"num_pages":40, author:"Jack", date:"3324"})
Роскошные сериализаторы DRF .create
и .update
имеют такие методы, что существует ограниченный и проверенный набор полей, что не относится к ручному обновлению.