【问题标题】:Django Error: "Unknown column 'categorytree.id' in 'field list'"Django 错误:“‘字段列表’中的未知列‘categorytree.id’”
【发布时间】:2016-11-29 10:05:33
【问题描述】:

通过 Django shell 运行以下命令时:

from myApp.models import *
print Categorytree.objects.all()

我收到此错误消息:

OperationalError: (1054, "未知列 'categorytree.id' in 'field 列表'")

这是我的模型的样子:

class Categorytree(models.Model):
    level = models.IntegerField(db_column='Level')  # Field name made lowercase.
    categorynode_idcategorynode = models.ForeignKey(Categorynode, models.DO_NOTHING, db_column='CategoryNode_idCategoryNode')  # Field name made lowercase.
    categorynode_idancestorcategorynode = models.ForeignKey(Categorynode, models.DO_NOTHING, db_column='CategoryNode_idAncestorCategoryNode', related_name='+')  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'categorytree'
        unique_together = (('categorynode_idcategorynode', 'categorynode_idancestorcategorynode'),)

请注意,它没有主键,也不应该有,但 Django 似乎认为会有一个主键 .id 字段。

【问题讨论】:

  • 你必须有一个主键。
  • 在相应的 MySQL 数据库设计中,该表不应该有主键。那么在models.py中加一个是否正确呢?

标签: django django-models


【解决方案1】:

引用Django docs

每个模型只需要一个字段才能具有 primary_key=True(显式声明或自动添加)。

如果您需要在没有主键的情况下访问表,则需要使用其他工具,例如SQLAlchemy

【讨论】:

  • 在我的情况下,为什么 Django 不会自动添加一个?
  • 啊,我对应的 MySQL 数据库表也必须添加主键列吗?
  • Django 实际上确实尝试添加一个,正如文档所述:“默认情况下,Django 为每个模型提供以下字段:id = models.AutoField(primary_key=True)”。但是id 不在表模式中,所以它会抛出你看到的错误。
  • 如果你有managed = False,我实际上不确定你是否一定需要在表中拥有一个主键。但是 Django 期望给定的“主键”表现得像一个:唯一标识一条记录(因此,没有重复)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多