Модели Django (1054, "Неизвестный столбец в списке полей" )
Не знаю, почему эта ошибка появляется. Вот модели, которые я создал -
from django.db import models
from django.contrib.auth.models import User
class Shows(models.Model):
showid= models.CharField(max_length=10, unique=True, db_index=True)
name = models.CharField(max_length=256, db_index=True)
aka = models.CharField(max_length=256, db_index=True)
score = models.FloatField()
class UserShow(models.Model):
user = models.ForeignKey(User)
show = models.ForeignKey(Shows)
Вот вид, с которого я обращаюсь к этим моделям -
from django.http import HttpResponse
from django.template import Context
from django.template.loader import get_template
from django.http import HttpResponse, Http404
from django.contrib.auth.models import User
def user_page(request, username):
try:
user = User.objects.get(username=username)
except:
raise Http404('Requested user not found.')
shows = user.usershow_set.all()
template = get_template('user_page.html')
variables = Context({
'username': username,
'shows' : shows})
output = template.render(variables)
return HttpResponse(output)
В этот момент я получаю сообщение об ошибке -
OperationalError: (1054, "Неизвестный столбец" appname_usershow.show_id "в" списке полей ")
Как вы видите, этот столбец даже не присутствует в моих моделях? Почему эта ошибка?
Ответы
Ответ 1
Как сказал @inception, схема моих таблиц изменилась & запущенный syncdb
не обновил уже созданные таблицы.
Очевидно, что любые изменения в моделях при обновлении через syncdb
не изменяют (как при обновлении/изменении) фактические таблицы. Поэтому я опустил соответствующую БД & побежал syncdb
на пустой БД. Теперь работает нормально. :)
Для других, SOUTH инструмент переноса данных для Django кажется предпочтительным вариантом. Похоже, предоставить варианты, которые django модели & syncdb
не хватает. Надо проверить...
Обновление 29 сентября 2019 года: начиная с Django 1.7 и выше, миграция встроена в ядро Django. Если вы используете предыдущую более низкую версию Django, вы можете найти репозиторий в BitBucket.
Ответ 2
Возможно, ваша схема таблиц была изменена? Кроме того, запуск syncdb
не обновляет уже созданные таблицы.
Вам может потребоваться отбросить все таблицы, а затем снова запустить syncdb
. Также не забудьте сделать резервную копию ваших данных.
Ответ 3
Обычно я получаю это, когда я пытаюсь получить доступ к полю, которого нет в базе данных.
Проверьте, существует ли поле в базе данных. Если вы меняете модель и выполняете syncdb, она не будет обновлять базу данных, я не уверен, если это произойдет.
В другой заметке Django предлагает ярлык для замены блока try/except в вашем коде с помощью get_object_or_404. (доступно в django.shortcuts)
try:
user = User.objects.get(username=username)
except:
raise Http404('Requested user not found.')
можно изменить на:
user = get_object_or_404(User, username=username)
Ответ 4
Я столкнулся с теми же проблемами:
Сначала запустите
manage.py sqlall [appname]
и вы можете найти:
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
и я добавлю руководство колонки:
ALTER TABLE tb_realtime_data ADD id integer AUTO_INCREMENT NOT NULL PRIMARY KEY FIRST;
а затем он работал.
Я думаю, что django добавит столбец с именем id.
Для удобства каждой модели задано поле автоинкрементного первичного ключа с именем id, если вы явно не указали primary_key = True в поле (см. раздел "AutoField" в Приложении A).
вы можете щелкнуть здесь для деталей.
Удачи.
Ответ 5
В соответствующем поле явно задано
primary_key = True
Ответ 6
Это довольно старый вопрос, но в любом случае вы можете найти следующее полезное: проверьте базу данных, скорее всего, вам не хватает show_id
в таблице appname_usershow
.
Это может произойти при изменении или добавлении поля, но вы забыли запустить миграцию.
ИЛИ ЖЕ
Когда вы получаете доступ к неуправляемой таблице и пытаетесь добавить ForeignKey
к вашей модели. Следуя примеру выше:
class UserShow(models.Model):
# some attributes ...
show = models.ForeignKey(Show, models.DO_NOTHING)
class Meta:
managed = False
db_table = 'appname_departments'
Ответ 7
Я создал файл модели для своего приложения, а затем сделал несколько sqlall
, поскольку я уточнил свои таблицы. Одно из внесенных мной изменений заключалось в том, что я установил primary_key=True
в одно из моих полей. В конце вызывается syncdb
. Добавлено фиктивное значение и пыталось получить к нему доступ с User.objects.all()
, User
, являющимся моим классом модели. Хотя это сработало хорошо, эта ошибка возникла при печати списка, возвращаемого вызовом all()
. Он читал DatabaseError: (1054, "Unknown column 'polls_user.id' in 'field list'")
Удивительно, но я попробовал и смог решить проблему с помощью другого вызова syncdb
. Я помню, что не видел столбец id в таблице в любое время во время упражнения, когда я проверил его через клиент командной строки mysql.
Ответ 8
Я получил эту ошибку при попытке использовать сериализаторы Django Rest Framework. Убедитесь, что у вас есть сериализатор, который подклассифицирует ModelSerializer
, что вы переносите любые изменения в Модели перед написанием классов сериализатора (или просто комментируете что-либо, связанное с сериализатором, мигрируете, а затем раскомментируете).
Ответ 9
PS F:\WebApp> python manage.py makemigrations
Вы пытаетесь добавить ненулевое поле 'цена' к месту назначения без значения по умолчанию; мы не можем этого сделать (базе данных нужно что-то для заполнения существующих строк).
Пожалуйста, выберите исправление:
1) Укажите одноразовое значение по умолчанию (будет установлено для всех существующих строк с нулевым значением для этого столбца)
2) Выйти, и позвольте мне добавить значение по умолчанию в models.py
Выберите опцию: 2
PS F:\WebApp> python manage.py sqlmigrate travello 0001
НАЧАТЬ;
- Создать модель назначения
CREATE TABLE travello_destination
(id
целое число AUTO_INCREMENT NOT NULL ПЕРВИЧНЫЙ КЛЮЧ, name
varchar (100) NOT NULL, img
varchar (100) NOT NULL, desc
длинный текст NOT NULL, offer
bool NOT NULL) ;
COMMIT;
PS F:\WebApp> python manage.py makemigrations
Миграции для 'travello': travello\миграции\0002_destination_price.py - Добавить цену поля к месту назначения
PS F:\WebApp> python manage.py перенести
Операции для выполнения: Применить все миграции: admin, auth, contenttypes, session, travello
Запущенные миграции: Применение travello.0002_destination_price... ОК
Ответ 10
Прямым решением является удаление файлов в папке.. /Project/App/migrations, а метод, позволяющий избежать этой проблемы, - создать новый столбец таблицы databaes вместо chagne существующего.