繁体   English   中英

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

[英]Django Models (1054, “Unknown column in 'field list'”)

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

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, “'field list' 中的未知列 'appname_usershow.show_id'”)

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

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

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

正如@inception 所说,我的表架构已更改并且运行syncdb不会更新已创建的表。

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

对于其他人来说,用于 Django 的SOUTH数据迁移工具似乎是最喜欢的选择。 它似乎提供了 django 模型和syncdb不足的选项。 必须检查...

2019 年 9 月 29 日更新:从 Django 1.7 起,迁移已内置到 Django 的核心中。 如果您运行的是以前较低版本的 Django,您可以在BitBucket上找到存储库。

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

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

另一方面,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)

我遇到了同样的问题:

首先,运行

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(请参阅附录 A 中标题为“AutoField”的部分)。

你可以点击这里了解详情。

祝你好运。

在适当的字段中明确设置

primary_key = True

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

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

  2. 之后运行下面的命令

python manage.py makemigrations

现在迁移将成功创建

  1. 之后运行下面的命令
python manage.py migrate --fake

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

这是一个很老的问题,但你会发现下面的有用反正:检查数据库,你最有可能缺少show_idappname_usershow表。

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

当你访问一个非管理的表和你想添加一个ForeignKey到模型。 按照上面的例子:

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

    class Meta:
        managed = False
        db_table = 'appname_departments'

这是一个迟到的回复,但希望有人会发现这很有用。

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

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

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

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

  2. py -3 manage.py 迁移

  3. py -3 manage.py 运行服务器

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

我为我的应用程序创建了一个模型文件,然后在优化我的表时做了几个sqlall 我所做的更改之一是将primary_key=True设置为我的字段之一。 最后调用了syncdb 添加了一个虚拟值并尝试使用User.objects.all()访问它, User是我的模型类。 尽管这工作正常,但在打印all()调用返回的列表时出现此错误。 它读取DatabaseError: (1054, "Unknown column 'polls_user.id' in 'field list'")

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

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

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 integer AUTO_INCREMENT NOT NULL PRIMARY KEY, name varchar(100) NOT NULL, img varchar(100) NOT NULL, desc longtext NOT NULL, offer bool NOT NULL); 提交; PS F:\\WebApp> python manage.py makemigrations Migrations for 'travello': travello\\migrations\\0002_destination_price.py - 将字段价格添加到目的地 PS F:\\WebApp> python manage.py migrate 要执行的操作:应用所有迁移:admin , auth, contenttypes, session, travello 运行迁移:应用 travello.0002_destination_price... 好的

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM