Додаючи поверх інших відповідей, ось трохи безпечніша версія, щоб запобігти псуванню пов’язаних полів:
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
методами є те, що існує обмежений і перевірений набір полів, що не стосується ручного оновлення.
**
оператор у довідковому посібнику з мови Python. docs.python.org/reference/expressions.html#calls