Python 不使用默认';id';Django模型中的主键?
考虑这样一种情况,为了定义ForeignKey关系,需要一个CHAR字段primary_键 经过初步调查,我确定了以下可能性,每种可能性都有各自的缺点: 1)使用“主键=True”。Python 不使用默认';id';Django模型中的主键?,python,django,orm,django-models,Python,Django,Orm,Django Models,考虑这样一种情况,为了定义ForeignKey关系,需要一个CHAR字段primary_键 经过初步调查,我确定了以下可能性,每种可能性都有各自的缺点: 1)使用“主键=True”。 示例1: class Collection(models.Model): code = models.CharField(primary_key=True, max_length=3) class Item(models.Model): code = models.CharField(primar
示例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)改为使用“收件人字段”/“通过”选项。
示例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主键,因此它解决了与第三方django应用程序配合良好的问题
潜在的缺点:在进一步调查之后,我发现了以下关于处理FK和多对多关系中CHAR/INT主键混合的OpenDjango ORM票据和bug
和13343
结论:
选项1比选项2好。但是:
是否有许多第三方应用程序依赖整数主键?
是否有一个简单的解决此限制的方法?
使用CHAR主键还有其他缺点吗?
GenericForeignKey
s会受到影响,因为它们都需要使用相同类型的外键。只要你远离他们,你就会没事。我在django admin应用程序中使用char字段作为主键时遇到问题。有关详细信息,请参阅
很难将id还原为主键
根据这一经验,我认为使用id以外的其他东西作为主键是个坏主意。我个人在我的应用程序中选择选项2,因为我看到大多数第三方应用程序都是这样做的,它避免了您在文章中提到的在Django ORM中混合CHAR和INT主键的大量问题
仅使用
unique=True
,我还没有遇到任何问题,因此我并不认为这样做有任何缺点。嗨,pewpewwarows,我想你的意思是“我的应用程序中的选项1”?示例2(选项2)存在混合CHAR和INT PK的问题/错误。嗨,Ignacio,您是否提到GenericForeignKey需要相同类型的外部PK?否,但它可以从以下事实派生:GenericForeignKey
构造函数的第二个参数是字段名称,一个字段只能有一种类型。