python - Django - 使用 unique_together = (ForeignKey, IntegerField) 重新排序(更新)对象

标签 python django orm

我有一个代表 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 查询,类似于

https://dba.stackexchange.com/questions/131118/how-can-i-swap-two-values-from-particular-column-in-a-table-in-postgres

在您的示例中将数据库约束作为 unique_together 也是一个好主意。

关于python - Django - 使用 unique_together = (ForeignKey, IntegerField) 重新排序(更新)对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37747687/

相关文章:

python - 使用行号python打印出每一行(来自文件)

python - wxPython:如何一键清除TextCtrl中的默认文本

Django 全文搜索 : says unaccent does not exist

ruby-on-rails - 使用一个查询在 Rails 中使用 ActiveRecord 同时更新多条记录?

node.js - Sequelize - 在验证模型关联时获得正确的路径

hibernate 只读事务

python - 如何使用注释返回多个值?

python - 为什么 np.linspace(1,5,5, dtype = int, endpoint=False) 会导致包含 1 两次的数组?

python - 重新显示时未显示初始数据的 Django ModelForm

javascript - 如何使用 Javascript 在 Django 中制作股票图表?