2012-01-21 145 views
8

我想弄清楚如何佈局我的兩個Django模型,以便當新模型保存到數據庫時,它的主鍵增加,這樣它是具有相同外鍵的所有記錄的下一個最高值。基於外鍵的Django模型自動增量主鍵

這很像this question asked,但我想知道如何在Django中做到這一點。下面是從問題這表明了類似的情況摘錄:

id | job_id | title 
0  1  hi 
1  1  hello 
2  1  goodbye 
0  2  hi 
1  2  hello 

我知道you can't have multiple primary keys in a Django model,你可以使用unique_together,但文檔稱,它在CREATE語句相當於UNIQUE聲明。

class ModelA(models.Model): 
    key = models.PositiveIntegerField(primary_key = True) 
    fk = models.ForeignKey(ModelB) 

    def Meta(self): 
     unique_together = ("key", "fk") 

在模型中與this answer一起工作來完成我在找什麼?模型之間的關係是一個ModelA有許多ModelB s,但每個ModelB只有一個ModelA

+1

第一段沒有解析。 –

+0

@ IgnacioVazquez-Abrams,我改寫了第一段並添加了一個例子。現在它更有意義嗎? – Dirk

回答

8

德克,你必須作出一些更改模型(如果允許)伊格納西奧說過。因此,ModelA現在應該如下所示。

class ModelA(models.Model): 
    key = models.PositiveIntegerField() 
    fk = models.ForeignKey(ModelB) 

    def Meta(self): 
     unique_together = ("key", "fk") 

    def save(self, *args, **kwargs): 
     key = cal_key(self.fk) 
     self.key = key 
     super(ModelA, self).save(*args, **kwargs) 

如,你可以看到,我有overridden the default save method從方法cal_key採取fk as argument計算密鑰值。因此,在模型文件中定義以下cal_key方法。

def cal_key(fk): 
    present_keys = ModelA.objects.filter(fk=fk).order_by('-key').values_list('key',flat=True) 
    if present_keys: 
     return present_keys[0]+1 
    else: 
     return 0 

cal_key方法清楚地表明你實際需要什麼。

+0

謝謝Sandip。我回答你的答案是因爲它比Ignacio的答案更便於攜帶。 – Dirk

+0

如果您的應用程序是多線程的,那麼這種解決方案是否有可能會引發unique_together驗證錯誤,因爲它會嘗試將相同的密鑰分配給兩個不同的功能,如果它們在同一時間保存? –

0

你可以試試這個:

AutoFile 

你可以找到here瞭解詳情。