现有 table (through/unique_together) 的 m2m
m2m for existing table (through/unique_together)
我在互联网上找到了关于如何处理与现有数据库模型的 m2m 关系的不同示例,例如 ex1 or here ex2,但是我仍然无法解决我遇到的错误。
我的模型如下所示。基本上,所有 table 都是手动创建的。
我收到以下错误消息:
OperationalError: (1054, "Unknown column 'supervisor_project.id' in 'field list'")
。
我仍然对什么时候使用 unique_together
和 through
感到有点困惑。您在下面的模型中看到任何错误吗? table supervisor_project
没有 id
字段,它的 PK 实际上是由两个 FK 组成的,即代理 PK。
class Supervisor(models.Model):
name = models.CharField(max_length=45, blank=True, null=True, help_text="Name, e.g. John Smith")
class Meta:
managed = False
db_table = 'supervisor'
def __unicode__(self):
return self.name
class Project(models.Model):
title = models.CharField(max_length=45, blank=True, null=True)
supervisors = models.ManyToManyField(Supervisor, through='SupervisorProject', through_fields=('project', 'supervisor'))
class SupervisorProject(models.Model):
supervisor = models.ForeignKey('Supervisor', on_delete=models.CASCADE)
project = models.ForeignKey('Project', on_delete=models.CASCADE)
class Meta:
managed = False
db_table = 'supervisor_project'
unique_together = (('supervisor', 'project'),)
Django 要求每个模型只有一个主键字段。它还不支持多列主键。
由于您没有在 SupervisorProject
模型上显式定义主键,Django 假定存在 automatic primary key field id
。当它在查询中包含 id
字段时,您会收到错误消息,因为它不存在。
如果可能,我会为每个中间值添加一个自动递增的 id 列 table。没有办法让 Django 自动将列添加到 tables。您已设置 managed=False
,因此 Django 希望您管理数据库 table。
我在互联网上找到了关于如何处理与现有数据库模型的 m2m 关系的不同示例,例如 ex1 or here ex2,但是我仍然无法解决我遇到的错误。
我的模型如下所示。基本上,所有 table 都是手动创建的。
我收到以下错误消息:
OperationalError: (1054, "Unknown column 'supervisor_project.id' in 'field list'")
。
我仍然对什么时候使用 unique_together
和 through
感到有点困惑。您在下面的模型中看到任何错误吗? table supervisor_project
没有 id
字段,它的 PK 实际上是由两个 FK 组成的,即代理 PK。
class Supervisor(models.Model):
name = models.CharField(max_length=45, blank=True, null=True, help_text="Name, e.g. John Smith")
class Meta:
managed = False
db_table = 'supervisor'
def __unicode__(self):
return self.name
class Project(models.Model):
title = models.CharField(max_length=45, blank=True, null=True)
supervisors = models.ManyToManyField(Supervisor, through='SupervisorProject', through_fields=('project', 'supervisor'))
class SupervisorProject(models.Model):
supervisor = models.ForeignKey('Supervisor', on_delete=models.CASCADE)
project = models.ForeignKey('Project', on_delete=models.CASCADE)
class Meta:
managed = False
db_table = 'supervisor_project'
unique_together = (('supervisor', 'project'),)
Django 要求每个模型只有一个主键字段。它还不支持多列主键。
由于您没有在 SupervisorProject
模型上显式定义主键,Django 假定存在 automatic primary key field id
。当它在查询中包含 id
字段时,您会收到错误消息,因为它不存在。
如果可能,我会为每个中间值添加一个自动递增的 id 列 table。没有办法让 Django 自动将列添加到 tables。您已设置 managed=False
,因此 Django 希望您管理数据库 table。