Comment exécuter une instruction update
and select
sur le même queryset
plutôt que de devoir faire deux requêtes: - une pour sélectionner l'objet - et une pour mettre à jour l'objet
L'équivalent en SQL serait quelque chose comme:
update my_table set field_1 = 'some value' where pk_field = some_value
update
méthode comme celle-ci, aucun signal attaché à ce modèle ou autre "code" ne fonctionnera contre les objets. Juste un pointeur de quelqu'un qui a été brûlé :)update
méthode est idéale pour les mises à jour de masse, mais elle devrait déclencher un avertissement dans votre tête lorsque vous l'utilisez que vous devez examiner tous les signaux attachés à cet objet qui pourraient également avoir besoin d'être déclenchés manuellementMyModel.objects.filter(pk=some_value).update(field1=self.data)
Les objets de base de données Django utilisent la même méthode save () pour créer et modifier des objets.
Réf .: https://docs.djangoproject.com/fr/1.9/ref/models/instances/
la source
Cette réponse compare les deux approches ci-dessus. Si vous souhaitez mettre à jour de nombreux objets sur une seule ligne, optez pour:
Sinon, vous devrez parcourir l'ensemble de requêtes et mettre à jour des objets individuels:
L'approche 1 est plus rapide car elle n'effectue qu'une seule requête de base de données, par rapport à l'approche 2 qui effectue des requêtes de base de données «n + 1». (Pour n éléments de l'ensemble de requêtes)
La première approche fait une requête db, c'est-à-dire UPDATE, la seconde en fait deux: SELECT puis UPDATE.
Le compromis est que, supposons que vous ayez des déclencheurs, comme la mise à jour
updated_on
ou tout autre champ connexe, il ne sera pas déclenché lors de la mise à jour directe, c'est-à-dire de l'approche 1.L'approche 1 est utilisée sur un jeu de requêtes, il est donc possible de mettre à jour plusieurs objets à la fois, pas dans le cas de l'approche 2.
la source
seulement dans un cas dans les
serializer
choses, vous pouvez mettre à jour de manière très simple!seulement dans un cas dans les
form
choses!la source
Django form
vient de Django Proper.