Django:使用' order'插入新行避免竞争条件的下一个最高值的值

时间:2015-09-19 13:54:08

标签: python mysql django

说我有一些模特:

from django.db import models


class List(models.Model):
    name = models.CharField(max_length=32)


class ListElement(models.Model):
    lst = models.ForeignKey(List)
    name = models.CharField(max_length=32)
    the_order = models.PositiveSmallIntegerField()

    class Meta:
        unique_together = (("lst", "the_order"),)

我希望将新的ListElement附加到List,其值the_order次高。如何在不创建竞争条件的情况下执行此操作,在查找最高ListElement和插入新的the_order之间插入另一个INSERT INTO list_elements (name, lists_id, the_order) VALUES ("another element", 1, (SELECT MAX(the_order)+1 FROM list_elements WHERE lists_id = 1));

我已经研究过select_for_update()但是这不会阻止新的INSERT发生,只是停止改变现有的元素。我也考虑过使用交易,但是如果另一个线程在我们面前到达那里就会失败,而且我不想循环直到我们成功。

我在想的是跟随下面的MySQL查询

INSERT INTO list_elements (name, lists_id, the_order) SELECT "another element", 1, MAX(the_order)+1 FROM list_elements WHERE lists_id = 1;

但是,即使这是无效的SQL,因为您无法从您正在插入的表格中进行选择。

也许有一种方法可以使用Django's F() expressions,但我还没有能够使用它。

AUTO_INCREMENT在这里不会有帮助,因为它是在表格范围内而不是每个外键。

编辑: 然而,这个SQL确实可以解决问题,doesn't appear to be a way to use the INSERT ... SELECT function from Django's ORM

0.1

0 个答案:

没有答案