Ошибка Django при ссылке на модель из представлений в двойных кавычках - PullRequest
0 голосов
/ 01 октября 2018
ProgrammingError at /app-name/url-name
    relation "TableName" does not exist
    LINE 1: SELECT (1) AS "a" FROM "TableName" WHERE "TableName..."

Я сделал inspectdb, подтвердил, что сопоставление соответствует тому, что автоматически устанавливается при запуске makemigrations, и удалил все миграции из таблицы django_migrations и повторно запустил migrate.Я также проверил, что миграции успешно импортированы, просмотрев таблицу django_migrations, а также запустив showmigrations.

Интересно, почему я вижу двойные кавычки вокруг имен таблиц, поэтому новые модели нельзя использовать?Интересно, что если я ссылаюсь на модель, которая будет использоваться в форме (а не в представлении), она действительно работает нормально, я вижу правильные входные данные в форме, поступающие из базы данных.Ошибка возникает, когда я выполняю запрос с использованием Django - этот запрос настроен в рамках той же самой модели TableName, правильно ли на него ссылаются?(вместо импорта TableName из app-name.models)

TableName.objects.using('CUSTOMDBSETTING').filter(colid='value')

Обратите внимание, что это работает, когда я пытаюсь использовать оболочку напрямую, а не через Django.У меня также нет первичного ключа для этой таблицы, и когда я пытаюсь установить не по умолчанию (не идентификатор), это дает мне еще одну ошибку.

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

('42S22', "[42S22] [Microsoft] [Драйвер ODBC 17 для SQL Server][SQL Server] Неверное имя столбца 'id'. (207) (SQLExecDirectW); [42S22] [Microsoft] [Драйвер ODBC 17 для SQL Server] [SQL Server] Оператор (ы) не может быть подготовлен. (8180) ")

1 Ответ

0 голосов
/ 28 декабря 2018

Таким образом, ответ на этот вопрос заключается в том, что если не назначить конкретный уникальный / первичный ключ в рассматриваемой модели, то будет применяться идентификатор по умолчанию, отображаемый в Django.

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

fields=[
    ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
...
]

Чтобы исправить эту проблему, либо используйте первичный ключ 'id' из Django, либо настройте первичныйключ - не нужно делать для реальной таблицы, только модель Django.Затем повторно запустите миграцию и убедитесь, что они применяются, чтобы поймать это изменение ... Теперь миграции должны выглядеть следующим образом (и ключ 'id' не будет использоваться)

 ('tableid', models.CharField(blank=True, db_column='TableID', max_length=255, primary_key=True, serialize=False)),

или что-то подобное, еслиавтоматически увеличивается

customid = models.AutoField(db_column='CustomID', null=False, primary_key=True, max_length=10)
...