with - django subquery




Modification d'un objet QuerySet à la volée dans Django (2)

Est-ce que je peux ou dois faire cela dans une vue?

a = SomeTable.objects.all()
for r in a:
    if r.some_column == 'foo':
        r.some_column = 'bar'

Ca a marché comme un champion, mais j'ai essayé quelque chose de similaire quelque part ailleurs et j'ai eu des résultats étranges, ce qui implique que les objets QuerySet n'aiment pas être joués avec. Et, je n'ai rien vu dans les docs, bon ou mauvais pour ce genre de truc.

Je sais qu'il y a d'autres façons de le faire, mais je veux spécifiquement savoir si c'est une mauvaise idée, pourquoi c'est mauvais, et si c'est vraiment mauvais, quelle est la meilleure manière de changer les valeurs sur django / pythonic? la mouche serait.


C'est très bien tant que vous ne faites rien plus tard qui fera réévaluer le jeu de requête - par exemple, le découper en tranches. Cela fera une autre requête à la base de données, et tous vos objets modifiés seront remplacés par des nouveaux.

Un moyen de vous protéger contre cela serait de convertir en une liste d'abord:

a = list(SomeTable.objects.all())

De cette façon, un découpage ultérieur, etc., ne provoquera pas un nouvel appel db, et toutes les modifications seront conservées.


Ouaip. Voir les documents ici

SomeTable.objects.filter(some_column='foo').update(some_column='bar')

J'irais avec l'idiome de Django. Il exécute le SQL avec une seule instruction avec 'where' et 'update' plutôt que d'envoyer plusieurs instructions SQL comme le ferait votre code. Cela fait gagner du temps. Vérifiez avec la 'connexion' de Django pour tester l'heure SQL.







django-views