Zusätzlich zu anderen Antworten ist hier eine etwas sicherere Version, um zu verhindern, dass verwandte Felder durcheinander gebracht werden:
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()
Es wird überprüft, ob das zu aktualisierende Feld bearbeitet werden kann, kein Primärschlüssel ist und nicht zu den verwandten Feldern gehört.
Anwendungsbeispiel:
book = Book.objects.first()
update_from_dict(book, {"num_pages":40, author:"Jack", date:"3324"})
Die luxuriösen DRF-Serialisierer .create
und .update
-Methoden haben den begrenzten und validierten Satz von Feldern, was bei manuellen Updates nicht der Fall ist.
**
Operator im Python-Referenzhandbuch. docs.python.org/reference/expressions.html#calls