อัปเดตชุดแบบสอบถามตามลำดับเฉพาะ

ฉันมีฟิลด์ "ดัชนี" ที่เก็บช่วงจำนวนเต็มตามมา เพื่อความปลอดภัยฉันตั้งค่าให้ไม่ซ้ำกัน

ตอนนี้ฉันต้องการเพิ่มฟิลด์นี้ทีละรายการ เพื่อให้ไม่ซ้ำกัน ฉันอัปเดตค่าตามลำดับจากมากไปน้อย:

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

สิ่งที่ทำให้ฉันประหลาดใจก็คือ ในเครื่องบางเครื่อง IntegrityError ปรากฏขึ้นและบ่นว่าค่าดัชนีซ้ำกัน

มีอะไรที่ฉันพลาดไปหรือเปล่า? ฉันสามารถบันทึกทีละรายการได้หรือไม่?

ขอบคุณล่วงหน้า!

อัปเดต:

ฉันคิดว่าปัญหาที่แท้จริงคือ ไม่มี ORDER BY ในคำสั่ง SQL UPDATE (ดู อัปเดตด้วย ORDER BY และ SQL เซิร์ฟเวอร์: อัปเดตตารางโดยใช้ ORDER BY)

แน่นอนว่า django เพียงแปลคำสั่งของฉันเป็น SQL UPDATE ด้วย ORDER_BY ซึ่งนำไปสู่พฤติกรรมที่ไม่ได้กำหนดและสร้างผลลัพธ์ที่แตกต่างกันในแต่ละเครื่อง


person Sam    schedule 13.04.2015    source แหล่งที่มา


คำตอบ (1)


คุณกำลังเรียงลำดับชุดแบบสอบถามจากน้อยไปมาก คุณสามารถทำให้จากมากไปหาน้อยได้โดยเพิ่ม '-' ลงในชื่อฟิลด์ตามลำดับโดย:

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

เอกสาร Django สำหรับ order_by

person Fran Muñoz    schedule 13.04.2015