2010-10-05 56 views
4

考慮爲了定義ForeignKey關係而需要CHAR字段primary_key的情況。在Django模型中不使用默認的「id」primary_key會產生什麼影響?

經過一番初步調查我已經確定了以下可能性,每一個都有自己的缺點:

1)使用「primary_key =真」。

Example 1:

class Collection(models.Model): 
    code = models.CharField(primary_key=True, max_length=3) 

class Item(models.Model): 
    code = models.CharField(primary_key=True, max_length=255, unique=True) 
    collection = models.ForeignKey('Collection', related_name='items') 

潛在的缺點:整合第三方應用程序時,某些第三方應用程序的Django依賴於默認的「身份證」 PK整型字段可能會導致問題。

2)改用'to_field'/'through'選項。

Example 2:

class Collection(models.Model): 
    code = models.CharField(Max_length=3, unique=True) 

class Item(models.Model): 
    collection = models.ForeignKey('Collection', to_field='code', related_name='items') 

這將使「系列」有其自己的ID primary_key,所以它解決了與第三方應用程序的Django很好打的問題。

潛在的缺點:經過進一步調查,我發現了以下開放Django的ORM門票和錯誤至於處理在FK CHAR/INT primary_keys和many-to-many關係的組合。

http://code.djangoproject.com/ticket/11319和13343

結論:

選項1比選項2
但是更好:
是依賴於整數primary_key有許多第三方應用程序?
是否有這個限制的簡單解決方法?
使用CHAR primary_key還有其他什麼缺點嗎?

回答

1

GenericForeignKey s會受到影響,因爲他們都需要使用相同類型的外國PK。只要你遠離他們,你應該沒問題。

+0

嗨伊格納西奧,你有沒有到GenericForeignKeys要求外國PK的同一類型的事實的內容? – AtlasStrategic 2010-10-07 07:23:32

+0

沒有,但可以從一個事實,即第二個參數'GenericForeignKey'構造是一個字段的名稱派生,那場只能有一個單一的類型。 – 2010-10-07 07:25:58

0

我個人在我的應用程序中使用了選項2,因爲這是我見過的大多數第三方應用程序所做的,並且它避免了您在帖子中提到的混合CHAR和INT Django ORM中的主鍵。

我還沒有碰到但只使用unique=True單一的問題,所以我實在看不出任何缺點這樣做吧。

+0

嗨Pewpewwarrows,我想你的意思是「我的應用程序選項1」?示例2(選項2)具有混合CHAR和INT PK的問題/錯誤。 – AtlasStrategic 2010-10-07 07:21:30

相關問題