Django: столбец DatabaseError не существует - PullRequest
8 голосов
/ 14 января 2011

У меня проблема с 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 ]

9 голосов
/ 16 января 2011

Попробуйте полностью удалить / стереть базу данных перед запуском syncdb.

Я помню, что мне нужно было это сделать некоторое время назад, когда я внес изменения в поля внешнего ключа.

4 голосов
/ 18 июля 2016

Пожалуйста, прочитайте это, прежде чем бросить всю базу данных

У меня была такая же проблема. Пожалуйста, прочитайте исключение полностью. У меня был класс ModelForm, который читал из моей таблицы для создания формы, и там было исключение. Я закомментировал, а затем запустил makemigrations и работает полностью. После этого я прокомментировал класс ModelForm, и все работает отлично.

Надеюсь, это поможет.

3 голосов
/ 09 ноября 2015

если вы используете Django 1.8, вы должны создать столбец. Чтобы убедиться, что вы правильно создали столбец, найдите файл миграции, в котором вы создали поле, и запустите:

./manage.py sqlmigrate app_name migration_name_sans_extension

Это выведет команды sql для создания столбца. Обязательно включите команды, которые обрабатывают отношения, и запустите команды в вашей консоли базы данных. Вы выиграли: «Вы должны сделать что-нибудь экстремальное, например, сбросить таблицу или базу данных».

3 голосов
/ 14 декабря 2012

Я исправил эту проблему, опустив конкретную таблицу к этой модели вопроса.Затем используется:

python manage.py syncdb

Если вы используете PostgreSQL, я рекомендую использовать phppgadmin в качестве веб-интерфейса, аналогичного PHPmyadmin, который используется для mySQL.

В качестве альтернативы пользовательскому интерфейсу вы можете просто выполнить командуline

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.

0 голосов
/ 01 июля 2011

Я столкнулся с той же проблемой и заметил, что в базе данных бэкэнда поле, в котором находятся внешние ключи, не существует. Проблема исчезла после того, как я создал поле (что я считаю своеобразным). Кажется, что Django не создает поле, помеченное как внешний ключ. Любая причина почему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...