首页 > 解决方案 > Django中一张表可以有多个主键吗?

问题描述

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

django.db.utils.OperationalError:表“certificate_light”有多个主键

但是,我发现其他堆栈溢出页面说一张表在 RDBMS 中可以有多个主键。
谁能知道我如何在 Django 中实现具有多个主键的表?

模型.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

标签: django

解决方案


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_together = (('certificate', 'zone'),)

推荐阅读