Ajoutant aux autres réponses, voici une version un peu plus sécurisée pour éviter de perturber les champs associés:
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()
Il vérifie que le champ que vous essayez de mettre à jour est modifiable, n'est pas une clé primaire et n'est pas l'un des champs associés.
Exemple d'utilisation:
book = Book.objects.first()
update_from_dict(book, {"num_pages":40, author:"Jack", date:"3324"})
Le luxe que les sérialiseurs DRF ont avec les méthodes .create
et .update
est qu'il y a un ensemble limité et validé de champs, ce qui n'est pas le cas pour la mise à jour manuelle.
2 votes
Oui. Essayez. Recherchez l'opérateur
**
dans le manuel de référence du langage Python. docs.python.org/reference/expressions.html#calls0 votes
Possible duplicate de Mettre à jour modèle django via kwargs