不知道为什么会出现这个错误。以下是我创建的模型 -
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'”)
如您所见,我的模型中甚至没有此列?为什么会出现这个错误?
答案 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数据库后端发布的相同错误,在解决了该错误很长时间之后,最终得到了以下解决方案。
通过工作台手动将列添加到数据库,其名称与错误消息中显示的名称完全相同。
然后在命令下运行
python manage.py makemigrations
现在将成功创建迁移
python manage.py migrate --fake
现在一切正常,没有任何数据丢失问题
答案 7 :(得分:1)
这是一个较晚的答复,但希望有人会发现它有用。
我当时正在使用DB模型研究Django REST API。当我向现有模型添加新列时(该列从一开始就已存在于db表中),我收到以下错误: “'字段列表'中的未知列',列名>'”已执行。
我错过的是将模型迁移到数据库中。
所以我从python终端执行了以下命令:
py -3 manage.py makemigrations --->即使该列存在于数据库中的数据库中,该列也不允许将新列添加为NULL值。开始。因此,您需要添加一个默认值,因为我的是Integerfield,所以我将模型中的列定义更新为IntegerField(default = 0)。 从这里开始,如果没有其他错误,它应该很简单。
py -3 manage.py migration
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
创建表travello_destination
(id
整数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下的文件,避免此问题的方法是创建新的数据库表列而不是现有的列。