2010-10-05 77 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

相关问题