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

Модели 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 "в" списке полей ")

Как вы видите, этот столбец даже не присутствует в моих моделях? Почему эта ошибка?

4b9b3361

Ответ 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 существующего.