Вопрос по python, database – Django - DatabaseError: нет такой таблицы

11

Я определил две модели:

class Server(models.Model):
    owners = models.ManyToManyField('Person')

class Person(models.Model):
    name = models.CharField(max_length=50)

admin.site.register(Server)
admin.site.register(Person)

После этого я даже проверил sql, просто для удовольствия:

BEGIN;
CREATE TABLE "servers_server_owners" (
    "id" integer NOT NULL PRIMARY KEY,
    "server_id" integer NOT NULL,
    "person_id" integer NOT NULL,
    UNIQUE ("server_id", "person_id")
)
;
CREATE TABLE "servers_server" (
    "id" integer NOT NULL PRIMARY KEY,
    "name" varchar(50) NOT NULL,
    "port" integer unsigned NOT NULL,
    "state" integer NOT NULL
)
;
CREATE TABLE "servers_person" (
    "id" integer NOT NULL PRIMARY KEY,
    "name" varchar(50) NOT NULL
)
;
COMMIT;

Там даже сказаноCREATE TABLE "servers_server_owners"

Я побежалsyncdb установить новые модели в базу данных. Я пошел в интерфейс администратора, чтобы определить некоторые объекты для игры, но я получил следующую ошибку:

DatabaseError at /admin/servers/server/1/  
no such table: servers_server_owners

Я выключил dev-сервер, побежалsyncdb снова запустил сервер: все та же проблема. Почему он не может найти таблицу, хотя он только что сказал мне, что создал идентификатор?

Либо у вас отсутствует информация в приведенном выше, либо ваш пример неверен. Промежуточной таблицей по умолчанию должно быть «Servers_server_person». если вы не определили промежуточную таблицу, используя "от" до " James R
python manage.py migrate решить вопрос для меня Arefe
@varesa: правильный способ ответить на свой вопрос в SO - опубликовать его как ответ и принять его, а не редактировать исходный вопрос. Добро пожаловать в переполнение стека! cha0site
@ cha0site Да, я знаю и уже попробовал. Это происходит только с 8-часовой задержкой, прежде чем люди с репутацией ниже 100 смогут ответить на свои вопросы. Я только отредактировал, чтобы избавить других, которые рассматривают этот вопрос, от попыток ответить на него, пока я не смогу опубликовать ответ. Осталось шесть часов. varesa
@James я не использовалthroughи я тоже подумал о том же самом, когда увидел sql. Кажется, подбирает название объекта varesa

Ваш Ответ

5   ответов
7

что таблица так и не была создана. Так как я довольно новичок в Django, я не знал, что./manage.py syncdb не обновляет существующие модели, а создает только те, которые не существуют.

Потому что модель "Сервер" существовал до того, как я добавил другую модель, и он уже был в db, 'a syncdb' на самом деле не создавать новые таблицы.

Так какdo вы создаете новые таблицы?
@Imray Есть несколько способов, самым простым из которых является удаление и воссоздание базы данных. Более сложный способ - использовать «инструмент миграции». Примерно в то время, когда я задавал вопрос, вам приходилось использовать внешний инструмент, такой как South, но я думаю, что похожий инструмент встроен в django. Увидетьdroidballoonответ для более старого решения иMichaelответ на новый varesa
4

Я думаю, что вы пропустите какую-то команду в уроке 1. просто следуйте:

./python manage.py makemigrations polls
python manage.py sql polls
./python manage.py syncdb

затем исправьте это и получите таблицы опроса, и вы можете увидеть созданную таблицу. Вы должны прочитатьmanage.py makemigrations команда.

Error: User Rate Limit Exceeded varesa
9

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

С его помощью вы можете легко:python manage.py migrate app_name и Юг напишет ваши изменения модели. документация это довольно просто.

0

use "manage.py help" to check the command if you find migrate and makemigration, it means your python has updated

шаг 1:

python manage.py ,makemigration

результат 1:

Migrations for 'mainsite':
mainsite\migrations\0001_initial.py
- Create model Post

шаг 2:

python manage.py migrate

результат 2:

Operations to perform:
Apply all migrations: admin, auth, contenttypes, mainsite, sessions
Running migrations:
Applying mainsite.0001_initial... OK

наконец, runserver. Готово

1

python manage.py makemigrations app_name

python manage.py migrate

Похожие вопросы