django中使用现有数据库的“未知列X.id”错误


问题内容

我正在尝试为现有的数据库创建模型。使用的输出manage.py inspectdb,我的models.py文件如下所示:

from django.db import models

...some more stuff here...

class Scripts(models.Model):
    run_site = models.ForeignKey(Sites, db_column='run_site')
    script_name = models.CharField(max_length=120)
    module_name = models.CharField(unique=True, max_length=120)
    type = models.CharField(max_length=24)
    cat_name = models.CharField(max_length=90)
    owner = models.ForeignKey(QAPeople, db_column='owner')
    only_server = models.CharField(max_length=120, blank=True)
    guest = models.IntegerField()
    registered = models.IntegerField()
    super = models.IntegerField()
    admin = models.IntegerField()
    run_timing = models.CharField(max_length=27)
    manual_owner = models.ForeignKey(QAPeople, db_column='manual_owner')
    script_id = models.IntegerField(unique=True,)
    version = models.IntegerField()
    comment = models.ForeignKey('ScriptComments', null=True, blank=True)
    class Meta:
        db_table = u'scripts'

当我尝试这样做Scripts.objects.all(),我得到

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\Python26\lib\site-packages\django\db\models\query.py", line 68, in __repr__
    data = list(self[:REPR_OUTPUT_SIZE + 1])
  File "C:\Python26\lib\site-packages\django\db\models\query.py", line 83, in __len__
    self._result_cache.extend(list(self._iter))
  File "C:\Python26\lib\site-packages\django\db\models\query.py", line 269, in iterator
    for row in compiler.results_iter():
  File "C:\Python26\lib\site-packages\django\db\models\sql\compiler.py", line 672, in results_iter
    for rows in self.execute_sql(MULTI):
  File "C:\Python26\lib\site-packages\django\db\models\sql\compiler.py", line 727, in execute_sql
    cursor.execute(sql, params)
  File "C:\Python26\lib\site-packages\django\db\backends\util.py", line 15, in execute
    return self.cursor.execute(sql, params)
  File "C:\Python26\lib\site-packages\django\db\backends\mysql\base.py", line 86, in execute
    return self.cursor.execute(query, args)
  File "C:\Python26\lib\site-packages\MySQLdb\cursors.py", line 173, in execute
    self.errorhandler(self, exc, value)
  File "C:\Python26\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
OperationalError: (1054, "Unknown column 'scripts.id' in 'field list'")

django为什么认为应该有一个scripts.id专栏?如何在 删除表格等的 情况 下进行修复?


问题答案:

默认情况下,每个模型上始终存在一个隐式id字段作为自动递增主键。请参阅Django文档中的primary_key,如何将该字段更改为其他名称,但需要有一个主键(也在表中)。

另外,您可能不想调用您的字段之一super,因为它使Python内置super在类主体中。也许有一天您会很难找到bug。