Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
如何在Django中创建包含两个字段的主键?_Django_Database_Postgresql_Python 2.7_Django Models - Fatal编程技术网

如何在Django中创建包含两个字段的主键?

如何在Django中创建包含两个字段的主键?,django,database,postgresql,python-2.7,django-models,Django,Database,Postgresql,Python 2.7,Django Models,我开发了一个特定的应用程序,使用指定的数据库和模型模式找到了它。我使用的是Django版本1.8.2。下面是一个问题。不必要的字段被省略了,模型名称是为了一个例子而发明的,因为我不能透露。考虑下面的模型A和B. class B (models.Model): name = models.CharField(max_length=100) class A (models.Model): name = models.CharField(max_length=100,

我开发了一个特定的应用程序,使用指定的数据库和模型模式找到了它。我使用的是Django版本1.8.2。下面是一个问题。不必要的字段被省略了,模型名称是为了一个例子而发明的,因为我不能透露。考虑下面的模型A和B.

class B (models.Model):

      name = models.CharField(max_length=100)

class A (models.Model):

      name = models.CharField(max_length=100, primary_key=True)
      related_name = models.ForeignKey(B, null=True, blank=True)

在一个项目运行了很长一段时间后,可能会有几个名称相同的a,但外键不同的B。在这个特殊的情况下,我想对主键“a”进行建模,它由两个字段组成:name和related name。如何在django中创建这样一个由两个字段组成的键?

您想使用复合键。Django不支持这一点。有一些支持,但你不能有关系,所以它的实际使用非常有限

目前Django型号仅支持此集合中的单个列, 拒绝使用表的自然主键的许多设计 多列。Django目前无法使用这些模式;他们 必须引入冗余的单列键(“代理项”) 键),强制应用程序执行任意或其他不必要的操作 选择在任何给定实例中为表使用哪个键


Django不支持复合键。但是你可以用


是否可以将
A
的主键改为django默认
id
?这似乎是显而易见的解决办法。嗨:-)谢谢你的回复。这是一个很好的解决方案,但在我的例子中,许多表都有一个外键表“a”,更改默认id将是一项非常大的工作。此外,使用诸如“a.objects.get(pk=“something”)”之类的查询和更改主键类型的大量代码需要大量工作。因此,我正在寻找一种不改变密钥类型的解决方案。基地有很多年的历史。在这种情况下,我不认为这可以在django解决。Django要求每个实例都有一个唯一的主键。即使您可以使用复合主键,我也不确定pk中的一个字段是可为空的外键是否是一个好主意。您是否可以使用
ManyToMany
关系而不是外键?不管怎样,这听起来像是你在本例中需要的。我考虑过了,但是模型“A”有额外的字段,这些字段也可能根据外键“B”的不同而有所不同。至于这个案子,我必须确定。谢谢:-)当我在一起使用unique_时,假设模型看起来与问题中所示的一样。在添加了元类模型A unique_together=(“name”,“related_name”)之后,我可以有两行name=“kris”不同的字段相关名称?我的意思是名称字段主键参数设置为true。>>>s=B.objects.create(name=“JAN”)>>>s.save()>>>d=A.objects.create(name=“Stasze”)>>>>d.save()>>k=A.objects.create(name=“Stasze”,related\u name=s)返回Database.Cursor.execute(self,query,params)django.db.utils.IntegrityError:唯一约束失败:test_comp_a.name它不是复合PK,请记住。您正在使用
A
类中的
name
属性作为主键,并创建一个重复的对象。如果您在许多
A
对象中使用相同的
名称
,请不要将其用作主键,使用
自动增量
作为默认值,然后将
唯一的
组合在一起就可以了。谢谢您的回复。在我的例子中,这并不适用,因为由于对模型A有许多依赖关系,对主键的更改并不那么容易。多亏了你,我遇到了一个新的可能性django,在未来肯定会使用它。在这种情况下,这不是我的解决方案。谢谢:-)
unique_together = ("name", "related_name")