Django:DatabaseError列不存在

时间:2011-01-14 01:46:38

标签: python database django models

我遇到了Django 1.2.4的问题。

这是一个模型:

class Foo(models.Model):
    # ...
    ftw = models.CharField(blank=True)
    bar = models.ForeignKey(Bar, blank=True)

刷新数据库后,我使用shell:

Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from apps.foo.models import Foo
>>> Foo.objects.all()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 67, in __repr__
    data = list(self[:REPR_OUTPUT_SIZE + 1])
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 82, in __len__
    self._result_cache.extend(list(self._iter))
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 271, in iterator
    for row in compiler.results_iter():
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/compiler.py", line 677, in results_iter
    for rows in self.execute_sql(MULTI):
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/sql/compiler.py", line 732, in execute_sql
    cursor.execute(sql, params)
  File "/usr/local/lib/python2.6/dist-packages/django/db/backends/util.py", line 15, in execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python2.6/dist-packages/django/db/backends/postgresql_psycopg2/base.py", line 44, in execute
    return self.cursor.execute(query, args)
DatabaseError: column foo_foo.bar_id does not exist
LINE 1: ...t_omg", "foo_foo"."ftw", "foo_foo...

我在这里做错了什么?

更新:如果我注释掉ForeignKey,问题就会消失。

更新2 :奇怪的是,这个单元测试运行得很好:

def test_foo(self):
    f = Foo()
    f.save()

    self.assertTrue(f in Foo.objects.all())

为什么它在这里工作但不在shell中?

更新3 :它在单元测试中工作但不在shell中工作的原因可能与正在使用的不同数据库有关:

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'postgresql_psycopg2',
        'NAME': 'foo',
        'USER': 'bar',
        'PASSWORD': 'baz',
        'HOST': '',
        'PORT': '',
    }
}

import sys
if 'test' in sys.argv or True:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': 'testdb'
        }
    }

更新4 :确认当我使用SQLite3作为数据库时,一切正常。

5 个答案:

答案 0 :(得分:9)

在运行syncdb之前尝试完全删除/擦除数据库。

我记得当我对外键字段进行更改时,需要做一段时间。

答案 1 :(得分:4)

请在删除整个数据库之前阅读此内容

我有同样的问题。请完整阅读例外。我有一个ModelForm类,它从我的表中读取以构建一个表单,并且存在异常。我注释掉然后运行makemigrations并完全运行。之后我评论了ModelForm类,一切都很完美。

希望这有帮助。

答案 2 :(得分:3)

我通过将特定表删除到该问题模型来解决此问题。然后使用:

python manage.py syncdb

如果您使用PostgreSQL,那么我建议使用phppgadmin,它是一个类似于用于mySQL的PHP​​myadmin的Web界面。

用户界面的替代方法,您只需执行命令行

su postgres #change user to postgres
psql <datebase> #access shell for <datebase> database
\d #list all tables
DROP TABLE "" CASCADE #select a table to drop
\q #exit shell

在\ d时,按q退出。

答案 3 :(得分:3)

如果您使用的是Django 1.8,则应创建该列。要确保正确创建列,请找到您在其中创建字段的迁移文件并运行:

./manage.py sqlmigrate app_name migration_name_sans_extension

这将输出sql命令以创建列。确保包含处理关系的命令并在数据库控制台中运行命令。你赢了&#39;必须做任何极端的事情,比如放弃桌子或数据库。

答案 4 :(得分:0)

我遇到了同样的问题并注意到在后端数据库中存在外键的字段不存在。创建字段后我的问题就消失了(我觉得这很奇怪)。 Django似乎没有创建标记为外键的字段。有什么理由吗?