Django: столбец DatabaseError не существует
у меня проблема с Django 1.2.4.
здесь:
class Foo(models.Model):
# ...
ftw = models.CharField(blank=True)
bar = models.ForeignKey(Bar, blank=True)
сразу после промывки базы данных я использую оболочку:
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())
почему он работает здесь, но не в Шелл?
обновление 3: причина, по которой он работает в модульном тестировании, но не оболочка может иметь какое-то отношение к различным используемым базам данных:
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 ответов
попробуйте полностью удалить / стереть базу данных перед запуском syncdb.
Я помню, что мне нужно было сделать это некоторое время назад, когда я внес изменения в поля внешнего ключа.
пожалуйста, прочитайте это, прежде чем отбросить всю вашу DB
У меня была такая же проблема. Пожалуйста, прочитайте исключение полностью. У меня был класс ModelForm, который читал из моей таблицы для создания формы, и исключение было там. Я закомментированы и запустите makemigrations и полностью работает. После этого я прокомментировал класс ModelForm, и все работает отлично.
надеюсь, что это помогает.
я исправил эту проблему, отбросив конкретную таблицу в эту модель вопроса. Затем используется:
python manage.py syncdb
Если вы используете PostgreSQL, то я рекомендую использовать phppgadmin его веб-интерфейс, подобный PHPmyadmin, который используется для mySQL.
альтернатива пользовательскому интерфейсу вы можете просто сделать командную строку
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.
Если вы используете Django 1.8, вы должны создать столбец. Чтобы убедиться, что столбец создан правильно, найдите файл миграции, в котором вы создали поле, и запустите:
./manage.py sqlmigrate app_name migration_name_sans_extension
это выведет команды sql для создания столбца. Обязательно включите команды, которые обрабатывают отношения и запускают команды в консоли databse. Вам нужно будет сделать что-нибудь экстремальное, например, удалить таблицу или базу данных.
Я столкнулся с той же проблемой и заметил, что в базе данных бэкэнда поле, в котором находятся внешние ключи, не существует. Проблема исчезла после того, как я создал поле (которое я считаю своеобразным). Кажется, что Django не создает поле, помеченное как внешний ключ. Почему?