我的Django模型是這樣的:如何在Django ManyToMany模型或MySQL中執行唯一集合?
class Entity(models.Model):
name = models.CharField(max_length=40)
examples = models.ManyToManyField(Example, blank=True)
tokens = models.ManyToManyField(Token, blank=True, null=True)
我想執行的令牌,即中唯一性,如果已經有與代幣的實體[「A」,「B」,「C」]我不知道想用['a','b','c']添加另一個。然而,帶有標記['a','b','c','d']或['a','b']的實體是不同的集合,應該添加。
如果已找到具有特定集合的實體,我想將已發現的新示例添加到ManyToMany中。舊的名字可以留下。
目前,我運行一個查詢來獲取一個存在的實體,其中有確切的標記集(這本身就是django中的一個挑戰),那麼如果發現我用新的例子更新它。問題在於它在多個服務器上的多個進程中運行,因此在檢查匹配實體是否存在以及是否存在匹配實體之間存在爭用條件,並創建了新匹配。這可能會導致創建具有重複標記集的實體。
我想出的一個解決方案是爲ManyToMany使用顯式貫穿模型,並覆蓋貫穿模型的保存方法以創建令牌集合的散列並將其包含在直通模型本身的列中一個獨特的約束。我認爲這會起作用,但它似乎不是一個特別優雅的解決方案。
我也想象這個問題是在SQL映射表的情況下,在你想要一個唯一集合的情況下有點普遍 - 也許這裏有一個衆所周知的解決方案?我當然願意使用原始的sql。
在此先感謝您的幫助!
我沒有看到一個很好的解決方案,但我不認爲我會得到更多的答覆,所以彼得得到了我作爲唯一受訪者的接受。 – andysk 2011-06-29 00:47:25