104 votes

Comment utiliser un dictionnaire pour mettre à jour des champs dans les modèles Django?

Supposons que j'ai un modèle comme celui-ci :

class Book(models.Model):
    num_pages = ...
    author = ...
    date = ...

Puis-je créer un dictionnaire, puis insérer ou mettre à jour le modèle en l'utilisant ?

d = {"num_pages":40, author:"Jack", date:"3324"}

2 votes

Oui. Essayez. Recherchez l'opérateur ** dans le manuel de référence du langage Python. docs.python.org/reference/expressions.html#calls

0 votes

1voto

Riliam Points 3

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.

0voto

PowerAktar Points 575

En se basant sur la réponse de @Thierry Lams :

Alors que Book.objects.filter(pk=pk).update(**d) fonctionne bien, cela a aussi pour effet secondaire de sauvegarder l'objet, ce qui peut ne pas être souhaitable.

Si vous ne voulez pas enregistrer, essayez ceci :

d = {"num_pages":40, author:"Jack", date:"3324"}
book =  Book.objects.get(pk=pk)
book.__dict__ = {**book.__dict__, **d}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X