考虑为了定义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还有其他什么缺点吗?
嗨伊格纳西奥,你有没有到GenericForeignKeys要求外国PK的同一类型的事实的内容? – AtlasStrategic 2010-10-07 07:23:32
没有,但可以从一个事实,即第二个参数'GenericForeignKey'构造是一个字段的名称派生,那场只能有一个单一的类型。 – 2010-10-07 07:25:58