Django: Impossible de mettre à jour une requête une fois qu'une tranche a été prise
Je suis en train de le faire:
UserLog.objects.filter(user=user).filter(action='message').filter(timestamp__lt=now)[0:5].update(read=True)
mais j'obtiens cette erreur:
Cannot update a query once a slice has been taken.
(à l'aide de django 1.2.1)
Ce que je fais mal?
source d'informationauteur xpanta
Vous devez vous connecter pour publier un commentaire.
Que les états d'erreur, vous ne pouvez pas appeler
update()
sur un QuerySet si vous avez pris une tranche.La raison:
LIMIT
instruction SQL.UPDATE
déclaration.Ce que vous essayez de le faire serait équivalent à
UPDATE ... WHERE ... LIMIT 5
qui n'est pas possible, du moins pas avec le standard SQL.
La la documentation suggère que quelque chose comme ce qui suit pourrait être possible - je ne suis pas sûr si je faisais de la limite intérieure de la
QuerySet
ignore la vérification autour de l'appel deupdate()
après découpage:À défaut, vous pouvez utiliser le
champ de recherche comme suit:
J'avais la même erreur lors de la tentative de limiter le nombre d'enregistrements renvoyés par un queryset.
J'ai trouvé que si nous sommes à l'aide de l'un de Django basé sur une classe générique vues comme le ArchiveIndexViewnous pouvons utiliser la
paginate_by =
attribut de limiter le nombre d'enregistrements.Par exemple (dans views.py):
Vous ne pouvez pas le faire. Du Django documents: QuerySet de référence de l'API de mise à jour
Si vous voulez couper quelques-uns des résultats d'un queryset, vous pouvez le copier
il à une autre variable (une copie est assez, ce qui est plus rapide
qu'une copie en profondeur car elle utilise les références à l'original
des objets.)
Cela permet de garder Django de se plaindre si vous avez un order_by filtre sur
votre table, depuis qu'il se passe après le découpage si vous le faites sur le principal
queryset objet