【问题标题】:m2m for existing table (through/unique_together)现有表的 m2m(通过/unique_together)
【发布时间】:2016-06-20 21:17:35
【问题描述】:

我在互联网上找到了有关如何处理与现有数据库模型的 m2m 关系的不同示例,例如ex1 或此处ex2,但是我仍然无法解决我得到的错误。 我的模型如下所示。基本上,所有手动创建的表。 我收到以下错误消息: OperationalError: (1054, "Unknown column 'supervisor_project.id' in 'field list'")。 对于何时将unique_togetherthrough 一起使用,我仍然有些困惑。您在下面的模型中看到任何错误吗?表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 django-models m2m


    【解决方案1】:

    Django 要求每个模型只有一个主键字段。它还不支持多列主键。

    由于您没有在 SupervisorProject 模型上显式定义主键,Django 假定存在 automatic primary key field id。当它在查询中包含 id 字段时,您会收到错误,因为它不存在。

    如果可能,我会在每个中间表中添加一个自动递增的 id 列。没有办法让 Django 自动将列添加到表中。你已经设置了managed=False,所以Django希望你管理数据库表。

    【讨论】:

    • 谢谢@Alasdair!在这种情况下你将如何进行。您会直接在数据库中的每个中间表中手动添加id 字段吗?或者django可以为每个表自动创建一个id(在model.py中定义)?
    • 谢谢@Alasdair!管理员现在正在更正后工作,即将 id 手动添加到 DB 模型中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 2020-04-13
    • 2017-02-19
    • 1970-01-01
    • 2016-01-01
    • 2016-05-07
    相关资源
    最近更新 更多