一个表在Django中可以有多个主键吗?

时间:2018-11-26 06:51:58

标签: django

我具有以下表格结构。
当我尝试迁移时,出现以下错误。

  

django.db.utils.OperationalError:表“ certificate_light”具有更多功能   比一个主键

但是,我发现其他stack overflow page表示一个表在RDBMS中可以具有多个主键。
谁能知道我如何在Django中实现具有多个主键的表?

models.py

class Certificate(models.Model):
    name=models.CharField(max_length=20)

class Zone(models.Model):
    zone=models.CharField(max_length=20)
    conditioned=models.BooleanField(default=True)

class Light(models.Model):
    certificate=models.ForeignKey(Certificate, on_delete=models.CASCADE,related_name='certificate')
    zone=models.ForeignKey(Zone, on_delete=models.CASCADE,related_name='lightzone')
    lpd=models.IntegerField()
    sensor=models.BooleanField(default=True)

更新
我添加了如下的详细错误消息。

  Applying certificate.0007_auto_20181126_1155...Traceback (most recent call last):
  File "C:\Users\obakatsu\Anaconda3\envs\webEP\lib\site-packages\django\db\backends\utils.py", line 63, in execute
    return self.cursor.execute(sql)
  File "C:\Users\obakatsu\Anaconda3\envs\webEP\lib\site-packages\django\db\backends\sqlite3\base.py", line 326, in execute
    return Database.Cursor.execute(self, query)
sqlite3.OperationalError: table "certificate_light" has more than one primary key

2 个答案:

答案 0 :(得分:2)

Django不完全支持多个主键。相反,您可以使用unique_togather。例如:

class Light(models.Model):
    certificate=models.ForeignKey(Certificate, on_delete=models.CASCADE,related_name='certificate')
    zone=models.ForeignKey(Zone, on_delete=models.CASCADE,related_name='lightzone')
    lpd=models.IntegerField()
    sensor=models.BooleanField(default=True)

    class Meta:
        unique_togather = (('certificate', 'zone'),)

答案 1 :(得分:1)

您可以在模型中使用多个OneToOne字段以及默认主键id。 OneToOne字段也像主键一样“表现”,即多行不能相同。最重要的是,您可以使用unique_together来组合这两个唯一字段。