说我有一些模特:
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