Django模型(1054,“字段列表中的未知列”')

时间:2010-09-24 12:55:44

标签: python django django-models

不知道为什么会出现这个错误。以下是我创建的模型 -

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)

此时我收到错误 -

操作错误:(1054,“字段列表中的未知列'appname_usershow.show_id'”)

如您所见,我的模型中甚至没有此列?为什么会出现这个错误?

13 个答案:

答案 0 :(得分:27)

也许您的表架构已更改?此外,运行syncdb不会更新已创建的表。

您可能需要删除所有表格和&然后再次运行syncdb。还记得备份你的数据!!

答案 1 :(得分:13)

由于@inception表示我的表架构已经改变了&运行syncdb没有更新已创建的表。

显然,通过syncdb更新时对模型的任何更改都不会更改(如更新/修改)实际表格。所以我放弃了相关的DB&在空DB上运行syncdb。现在它工作正常。 :)

对于其他人来说,Django的SOUTH数据迁移工具似乎是最受欢迎的选择。它似乎提供了django模型和选项的选项。 syncdb不及格。必须退房...

答案 2 :(得分:5)

通常情况下,当我尝试访问数据库中不存在的字段时,我会得到这个。

检查数据库中是否存在该字段。如果您更改模型并执行syncdb,它将不会更新数据库,我不确定是否是这种情况。

另一方面,Django提供了使用get_object_or_404替换代码中的try / except块的快捷方式。 (可在django.shortcuts中找到)

try:
     user = User.objects.get(username=username)
except:
     raise Http404('Requested user not found.')

可以更改为:

user = get_object_or_404(User, username=username)

答案 3 :(得分:3)

我遇到了同样的问题:

首先,运行

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本身的列。

  

为方便起见,除非您在字段上明确指定primary_key = True,否则每个模型都会获得一个名为id的自动增量主键字段(请参阅附录A中标题为“AutoField”的部分)。

您可以点击here了解详情。

祝你好运。

答案 4 :(得分:2)

在相应字段中明确设置

primary_key = True

答案 5 :(得分:1)

这是一个很老的问题,但是无论如何您可能会发现以下有用的东西: 检查数据库,您很可能缺少show_id表中的appname_usershow

当您更改或添加字段但忘记运行迁移时,可能会发生这种情况。

OR

当您访问非托管表并试图向模型中添加ForeignKey时。 按照上面的示例:

class UserShow(models.Model):
    # some attributes ...
    show = models.ForeignKey(Show, models.DO_NOTHING)

    class Meta:
        managed = False
        db_table = 'appname_departments'

答案 6 :(得分:1)

我遇到了与您在上面使用MySQL数据库后端发布的相同错误,在解决了该错误很长时间之后,最终得到了以下解决方案。

  1. 通过工作台手动将列添加到数据库,其名称与错误消息中显示的名称完全相同。

  2. 然后在命令下运行

python manage.py makemigrations

现在将成功创建迁移

  1. 然后在命令下运行
python manage.py migrate --fake

现在一切正常,没有任何数据丢失问题

答案 7 :(得分:1)

这是一个较晚的答复,但希望有人会发现它有用。

我当时正在使用DB模型研究Django REST API。当我向现有模型添加新列时(该列从一开始就已存在于db表中),我收到以下错误: “'字段列表'中的未知列',列名>'”已执行。

我错过的是将模型迁移到数据库中。

所以我从python终端执行了以下命令:

  1. py -3 manage.py makemigrations --->即使该列存在于数据库中的数据库中,该列也不允许将新列添加为NULL值。开始。因此,您需要添加一个默认值,因为我的是Integerfield,所以我将模型中的列定义更新为IntegerField(default = 0)。 从这里开始,如果没有其他错误,它应该很简单。

  2. py -3 manage.py migration

  3. py -3 manage.py runserver

执行这些步骤后,当我调用REST API时,它们就可以正常工作。

答案 8 :(得分:0)

我为我的应用创建了一个模型文件,然后在我精炼表格时做了几个sqlall。我做的一项更改是将primary_key=True设置为我的某个字段。最后要求syncdb。添加了虚拟值,并尝试使用User.objects.all()访问它,User是我的模型类。虽然这很好,但是在打印all()调用返回的列表时出现了这个错误。它读为DatabaseError: (1054, "Unknown column 'polls_user.id' in 'field list'")

令人惊讶的是,我尝试过,可以通过另一次调用syncdb来解决问题。我记得在整个练习过程中,当我通过mysql命令行客户端检查时,没有看到表中的id列。

答案 9 :(得分:0)

我在尝试使用Django Rest Framework序列化程序时收到此错误。确保您有一个子类ModelSerializer的序列化程序,在编写序列化程序类之前将任何更改迁移到Models(或者只是评论与序列化程序相关的任何内容,迁移,然后取消注释)。

答案 10 :(得分:0)

PS F:\ WebApp> python manage.py makemigrations 您正在尝试将非空字段“价格”添加到目的地,而没有默认设置;我们无法做到这一点(数据库需要一些东西来填充现有行)。 请选择一个修复程序:  1)现在提供一次性的默认值(将在所有现有行上设置此列的值为空)  2)退出,然后让我在models.py中添加默认值 选择一个选项:2 PS F:\ WebApp> python manage.py sqlmigrate travello 0001

BEGIN;

-创建模型目的地

创建表travello_destinationid整数AUTO_INCREMENT NOT NULL主键,name varchar(100)NOT NULL,img varchar(100)NOT NULL,{{1 }} longtext NOT NULL,desc bool NOT NULL); 承诺; PS F:\ WebApp> python manage.py makemigrations “ travello”的迁移:   travello \ migrations \ 0002_destination_price.py     -将现场价格添加到目的地 PS F:\ WebApp> python manage.py迁移 要执行的操作:   应用所有迁移:管理员,身份验证,内容类型,会话,travello 运行迁移:   正在应用travello.0002_destination_price ...确定

答案 11 :(得分:0)

在使用多个VarChar字段的组合主键并尝试调用table_set.all()查询集时遇到了这个问题。 Django希望为此查询集创建一个table_name_id PK列,但没有列,因此抛出了此错误。 我通过手动创建table_name_id并将其设置为自动递增的整数PK列而不是复合PK来解决此问题。 然后,我在模型的meta部分中将这些VarChar复合列指定为unique_together,以便它们像PK一样起作用。

答案 12 :(得分:-2)

直接解决方案是删除文件夹../Project/App/migrations下的文件,避免此问题的方法是创建新的数据库表列而不是现有的列。