python – 在Django模型中不使用默认的’id’primary_key会有什么影响?

考虑需要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使用相同的类型.只要你远离他们,你应该没事.

点赞