Il y a eu des discussions sur la possibilité de faire des tranches d'un jeu de requête et de pouvoir ensuite les mettre à jour avant, mais AFAIK n'a jamais rien fait. Je ne pense pas que vous pouvez copier une tranche d'un jeu de requête, mais dans ce cas, vous n'aurez pas besoin de le faire. Si votre commande est un entier unique, vous seriez en mesure de le faire:
qs = AModel.objects.exclude(state="F").order_by("order")
if len(qs) > 3:
slice = qs.exclude(order__gt=qs[3])
else:
slice = qs
slice.update(state='F')
J'utilise exclure pour éliminer les éléments indésirables, mais cela ne fonctionnera que si l'ordre est unique, sinon vous ne serez pas en mesure de savoir combien vous mettez à jour. Pour de cas n'est pas unique, il sera toujours possible à l'aide d'une seconde et arg unique afin:
qs = AModel.objects.exclude(state="F").order_by("order", "pk")
if len(qs) > 3:
slice = qs.exclude(order__gt=qs[3]).exclude(order=qs[3], pk__gt=qs[3])
...
Notez que ceci est nonatomic, même dans une transaction (au moins dans Postgres), sauf si vous enlevez d'abord un verrou de table. –
Vous pouvez copier un jeu de requête avec qs.all(), mais cela ne vous aidera pas ici. –
Je voulais dire copier une partie d'un QuerySet pour en créer un nouveau sur lequel vous pouvez exécuter la mise à jour. Réponse clarifiée – googletorp