Подтвердить что ты не робот

Django нет такой таблицы:

У меня есть модели в Django, как показано ниже.

class Pupil(models.Model):
    forename = models.CharField(max_length=30)
    surname = models.CharField(max_length=30)
    dateofbirth = models.DateField()
    year = models.IntegerField()
    class_group = models.CharField(max_length=30)
    email = models.EmailField(blank=True)
    assignments = models.ManyToManyField('Assignment', verbose_name='related assignments')

    def __unicode__(self):
        return u'%s %s' % (self.forename, self.surname)

class Subject(models.Model):
    name = models.CharField(max_length=30)
    level = models.CharField(max_length=30)
    teachers = models.ManyToManyField('Teacher', verbose_name='related teachers')

    def __unicode__(self):
        return self.name

class Teacher(models.Model):
    forename = models.CharField(max_length=30)
    surname = models.CharField(max_length=30)
    email = models.EmailField(blank=True)

    def __unicode__(self):
        return u'%s %s' % (self.forename, self.surname)

class Assignment(models.Model):
    assignment_name = models.CharField(max_length=30)
    date_assigned = models.DateField()
    date_submitted = models.DateField()

    def __unicode__(self):
        return self.assignment_name

Когда я пытаюсь добавить ученика и присоединяю назначение ученику к администратору, я получаю ошибку базы данных -

no such table: homework_pupil_assignments

после прочтения this Я понял, что это может быть связано с тем, что django не обновляет мои модели, как когда я делаю manage.py sqlall homework

Я вижу следующее:

BEGIN;
CREATE TABLE "homework_pupil_assignments" (
    "id" integer NOT NULL PRIMARY KEY,
    "pupil_id" integer NOT NULL,
    "assignment_id" integer NOT NULL,
    UNIQUE ("pupil_id", "assignment_id")
)
;
CREATE TABLE "homework_pupil" (
    "id" integer NOT NULL PRIMARY KEY,
    "forename" varchar(30) NOT NULL,
    "surname" varchar(30) NOT NULL,
    "dateofbirth" date NOT NULL,
    "year" integer NOT NULL,
    "class_group" varchar(30) NOT NULL,
    "email" varchar(75) NOT NULL
)
;
CREATE TABLE "homework_subject_teachers" (
    "id" integer NOT NULL PRIMARY KEY,
    "subject_id" integer NOT NULL,
    "teacher_id" integer NOT NULL,
    UNIQUE ("subject_id", "teacher_id")
)
;
CREATE TABLE "homework_subject" (
    "id" integer NOT NULL PRIMARY KEY,
    "name" varchar(30) NOT NULL,
    "level" varchar(30) NOT NULL
)
;
CREATE TABLE "homework_teacher" (
    "id" integer NOT NULL PRIMARY KEY,
    "forename" varchar(30) NOT NULL,
    "surname" varchar(30) NOT NULL,
    "email" varchar(75) NOT NULL
)
;
CREATE TABLE "homework_assignment" (
    "id" integer NOT NULL PRIMARY KEY,
    "assignment_name" varchar(30) NOT NULL,
    "date_assigned" date NOT NULL,
    "date_submitted" date NOT NULL
)
;
COMMIT;

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

Может ли кто-нибудь предложить, как я могу получить базу данных (sqlite3), чтобы отразить модели или указать, что я делаю неправильно?

4b9b3361

Ответ 1

Обновленный ответ для миграций Django без south плагина:

Как предложил TT в своем ответе, мой предыдущий ответ был для плагина south миграции, когда у Django нет никаких функций миграции схемы. Сейчас (работает в Django 1. 9+):

ТТ написал :

Вы можете попробовать это!

python manage.py makemigrations

python manage.py migrate --run-syncdb

Устаревший плагин для south миграций

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

  1. Используйте любой инструмент SQLite GUI (например, http://sqliteadmin.orbmu2k.de/).
  2. Измените определение модели, чтобы оно соответствовало определению базы данных (лучший подход - комментировать новые поля)
  3. Удалить папку migrations в вашей модели
  4. Удалите строки в таблице south_migrationhistory где app_name соответствует имени вашего приложения (возможно, homework)
  5. ./manage.py schemamigration <app_name> --initial: ./manage.py schemamigration <app_name> --initial
  6. Создайте таблицы с помощью ./manage.py migrate <app_name> --fake (--fake пропустит выполнение SQL, поскольку таблица уже существует в вашей базе данных)
  7. Внесите изменения в модель вашего приложения
  8. ./manage.py schemamigration <app_name> --auto
  9. Затем примените изменения к базе данных: ./manage.py migrate <app_name>

Шаги 7,8,9 повторяются всякий раз, когда ваша модель нуждается в каких-либо изменениях.

Ответ 2

Вы можете попробовать это!

python manage.py migrate --run-syncdb

У меня та же проблема с Django 1.9 и 1.10. Этот код работает!

Ответ 3

Если вы используете последнюю версию django 2.x или 1.11.x, вы должны сначала создать миграции,

python manage.py makemigrations

После этого вам просто нужно запустить команду migrate для синхронизации базы данных.

python manage.py migrate --run-syncdb

Они будут синхронизировать вашу базу данных и модели Python, а также вторая команда напечатает все sql позади него.

Ответ 4

sqlall просто печатает SQL, он не выполняет его. syncdb создаст таблицы, которые еще не созданы, но не изменяет существующие таблицы.

Ответ 5

Я думаю, что вы можете попробовать

python manage.py syncdb

Даже sqlite3 нужен syncdb

во-вторых, вы можете проверить имя файла sql

это должно выглядеть как xxx.s3db

Ответ 6

Один из способов синхронизировать вашу базу данных с вашими моделями django - это удалить файл базы данных, выполнить makemigrations и снова перенести команды. Это будет отражать структуру ваших моделей Django в вашей базе данных с нуля. Тем не менее, обязательно сделайте резервную копию файла базы данных перед удалением на случай, если вам нужны ваши записи.

Это решение сработало для меня, так как я не сильно беспокоился о данных и просто хотел, чтобы моя структура БД и моделей синхронизировалась.