2017-07-05 235 views
3

我有一個模型如下。Django模型unique_together主鍵和唯一約束

class mc(models.Model): 
ap=models.CharField(max_length=50,primary_key=True) 
de=models.CharField(max_length=50) 
STATUS=models.CharField(max_length=12,default='Y') 
class Meta: 
    unique_together=(("ap","de"),) 
    db_table='mc' 

我對錶mc寫了ap ='1',de ='2'。

+----+----+--------+ 
| ap | de | STATUS | 
+----+----+--------+ 
| 1 | 2 | Y  | 
+----+----+--------+ 

然後我試着寫ap ='1'和de ='3',但它只是覆蓋了前一個。現在這張表包含了

+----+----+--------+ 
| ap | de | STATUS | 
+----+----+--------+ 
| 1 | 3 | Y  | 
+----+----+--------+ 

然後我試着寫ap ='2',de ='3'及其工作。因爲我已經賦予unique_together,ap和de的組合不起作用。

但是unique_together的工作,如果我沒有使用'primary_key'或'唯一'約束ap或de。

你能幫我嗎?如何在主鍵上使用unique_together?

實際的問題是,我有另一個類mc1使用外鍵的字段ap。

class mc1(models.Model):                        

    test=models.ForeignKey(mc,on_delete=models.CASCADE,to_field='ap') 

因此,mc.ap應該是唯一的以定義一個外鍵。

回答

5

Django不支持多列主鍵。幾年來它一直是feature request。每個型號must have one primary key

就你而言,如果ap是主鍵,那麼ap中的每個值必須是唯一的。無法同時存儲(ap=1, de=2)(ap=1, de=3)

也許你可以添加另一個字段作爲主鍵。那麼你將能夠有unique_together('ap', 'de')

+0

是的,我也嘗試過。但我有另一個班級的孩子,因爲我有一個外鍵給ap。當我遷移它時會發出一些錯誤,說「ap應該是唯一的」。 –

+0

我該如何解決這個問題?任何通過使用信號解決這個問題的方法? –

+0

您可以將外鍵用於實際的主鍵,或者有兩個整數字段來存儲'ap'和'de'值(但在這種情況下,您將失去約束檢查)。我看不出信號如何幫助你。 – Alasdair