我有一个代表 Session
的模型(比如说一小时的 child 类(class)),它有许多必须遵循命令的关联 Task
。更容易理解:
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', )
假设我想更新单个 session 的顺序
(想象一下常见的拖放重新排序)。因此,通过更新一个任务的顺序,我需要对其余任务重新排序,这样才不会破坏唯一性。
图形示例(假设我希望带有 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 次:
https://github.com/bfirsh/django-ordered-model/blob/master/ordered_model/models.py#L122-L123
另见:
https://www.djangopackages.com/grids/g/model-ordering/
最好的办法是编写自定义 SQL 查询,类似于
在您的示例中将数据库约束作为 unique_together
也是一个好主意。
关于python - Django - 使用 unique_together = (ForeignKey, IntegerField) 重新排序(更新)对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37747687/