perbarui kumpulan kueri dalam urutan tertentu

Saya memiliki bidang "indeks" yang menyimpan rentang bilangan bulat, demi keamanan saya mengaturnya unik.

sekarang saya ingin menambah bidang ini satu per satu, agar tetap unik saya memperbarui nilainya dalam urutan menurun:

MyModel.objects.all().order_by('-index').update(index=F('index')+1)

yang mengejutkan saya adalah di beberapa mesin IntegrityError muncul dan mengeluhkan nilai indeks duplikat.

apakah ada sesuatu yang saya lewatkan? bisakah saya menyimpan catatan satu per satu saja?

Terima kasih sebelumnya!

PEMBARUAN:

Saya pikir akar masalahnya adalah tidak ada ORDER BY dalam perintah SQL UPDATE (lihat PERBARUI dengan ORDER BY, dan juga SQL Server: UPDATE tabel dengan menggunakan ORDER BY)

Jelas Django hanya menerjemahkan pernyataan saya ke dalam UPDATE SQL dengan ORDER_BY, yang mengarah pada perilaku tidak terdefinisi dan menciptakan hasil yang berbeda per mesin.


person Sam    schedule 13.04.2015    source sumber


Jawaban (1)


Anda mengurutkan kumpulan kueri secara menaik. Anda dapat membuatnya menurun dengan menambahkan '-' pada nama field secara berurutan:

MyModel.objects.all().order_by('-index').update(index=F('index')+1)

Dokumen Django untuk order_by

person Fran Muñoz    schedule 13.04.2015