Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 不使用默认';id';Django模型中的主键?_Python_Django_Orm_Django Models - Fatal编程技术网

Python 不使用默认';id';Django模型中的主键?

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

考虑这样一种情况,为了定义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(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
构造函数的第二个参数是字段名称,一个字段只能有一种类型。