我有一個模型,代表Session
(說一個孩子一個小時的課程),有一定數量的關聯Task
s必須遵循訂單。更易於理解:Django - 重新排序(更新)對象與unique_together =(ForeignKey,IntegerField)
class Task(models.Model):
(...)
order = models.PositiveIntegerField('offset from the beginning of a Session')
session = models.ForeignKey(Session, related_name='tasks')
unique_together = ('session', 'order')
ordering = ('order',)
說我想更新單個會話的order
(想象一個共同的拖放重新排序)。因此,通過更新一個任務的順序,我需要重新排序其餘的任務,以便唯一性不會制動。
圖形爲例(假設我想和pk=5014
任務是在第二位置(order=1
))
Initial state: Final state:
| pk | order | name | | pk | order | name |
|------|-------|------| |------|-------|------|
| 5011 | 0 | A | | 5011 | 0 | A |
| 5012 | 1 | B | ----> | 5014 | 1 | D |
| 5013 | 2 | C | | 5012 | 2 | B |
| 5014 | 3 | D | | 5013 | 3 | C |
我的問題是如何與Django的ORM更新(如果可能),或者這將是一個優雅的方式來做到這一點,因爲我只能想到用新的順序(例如order = 50)保存所需的任務,然後重新排列其餘的任務,最後重新分配所需的任務順序到所需的任務。
是否有類似於bulk_update
(經過長時間研究後我沒有找到類似的東西),它允許我爲所有任務修改order
字段,然後一次保存所有任務?還是我必須自己照顧這個unique_together?
它通常是最好的重用現有的解決方案 https://github.com/bfirsh/django-ordered-model 雖然它仍然歸結爲2序列節省: http://dba.stackexchange.com/questions/131118/how-can-i-swap-two-values-from-particular-column-in-a-table-in-postgres 另請參閱:https://www.djangopackages.com/grids/g/model-訂購/ 最好的辦法是編寫一個自定義的SQL查詢,沿着 http://dba.stackexchange的行。com/questions/131118/how-can-i-swap-two-values-from-particular-column-in-a-table-in-postgres 將數據庫限制作爲你的'unique_together' – seeg
謝謝你真的很多,這正是我所期待的。我會看看,並考慮到所有的想法! – vabada
@seeg如果您不介意發表您的評論作爲答案我會將其標記爲已接受,因爲它解決了我的問題 – vabada