簡體   English   中英

在Django模型中不使用默認的'id'primary_key的全部含義是什么?

[英]What are the full implications of not using the default 'id' primary_key in your Django model?

考慮以下情況:需要CHAR字段primary_key來定義ForeignKey關系。

經過初步調查,我發現了以下幾種可能性,每種都有各自的缺點:

1)使用“ primary_key = True”。

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應用程序取決於默認的“ id” 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應用完美兼容的問題。

潛在的缺點:經過進一步的研究,我發現了以下有關處理FK中的CHAR / INT primary_keys和多對多關系的混合的Django ORM公開票證和bug。

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

結論:

選項1優於選項2。
然而:
有很多依賴整數primary_key的第三方應用程序嗎?
有此限制的簡單解決方法嗎?
使用CHAR primary_key還有其他缺點嗎?

GenericForeignKey會受苦,因為它們都需要對外部PK使用相同的類型。 只要您遠離它們,就可以了。

使用char字段作為主鍵時,我在django admin應用程序中遇到了麻煩。 有關在django admin中保存對象的信息,請參見unicode錯誤

很難將ID恢復為主鍵,請參閱在現有Django應用中更改主鍵的最佳方法是什么?

根據這種經驗,我認為使用除id以外的其他內容作為主鍵是一個壞主意。

我個人選擇應用程序中的選項2,因為這是我看到的大多數第三方應用程序所采用的方式,並且避免了您已經在帖子中提出的關於混合CHAR和INT主鍵的問題。 Django ORM。

我還沒有遇到任何問題,只是使用unique=True ,所以我沒有看到這樣做的任何缺點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM