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

Sri*_*aju 35 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)
Run Code Online (Sandbox Code Playgroud)

以下是我访问这些模型的视图 -

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)
Run Code Online (Sandbox Code Playgroud)

此时我收到错误 -

OperationalError:(1054,"字段列表'中的未知列'appname_usershow.show_id'")

如您所见,我的模型中甚至不存在此列?为什么这个错误?

小智 27

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

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


Sri*_*aju 14

由于@inception表示我的表架构已更改并且正在运行,syncdb因此未更新已创建的表.

显然,更新后对模型的任何更改syncdb都不会更改(如更新/修改)实际表.所以我删除了相关的DB并运行syncdb在空DB上.现在它工作正常.:)

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


Sri*_*ndi 6

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

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

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

try:
     user = User.objects.get(username=username)
except:
     raise Http404('Requested user not found.')
Run Code Online (Sandbox Code Playgroud)

可以改为:

user = get_object_or_404(User, username=username)
Run Code Online (Sandbox Code Playgroud)