考虑需要CHAR字段primary_key来定义ForeignKey关系的情况.
经过一些初步调查后,我发现了以下几种可能性,每种都有其自身的缺点:
1)使用’primary_key = True’.
例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’选项.
例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')
这将允许’Collection’拥有自己的id primary_key,因此它解决了与第三方django应用程序很好地协作的问题.
潜在的缺点:经过进一步调查后,我发现以下打开的Django ORM票证和错误处理FK中的CHAR / INT primary_keys和多对多关系.
http://code.djangoproject.com/ticket/11319和13343
结论:
选项1优于选项2.
然而:
是否有许多第三方应用程序依赖于整数primary_key?
这种限制是否有简单的解决方法?
使用CHAR primary_key还有其他缺点吗?
最佳答案 GenericForeignKeys会受到影响,因为他们都需要为外国PK使用相同的类型.只要你远离他们,你应该没事.