OperationalError,没有这样的列。姜戈

Posted

技术标签:

【中文标题】OperationalError,没有这样的列。姜戈【英文标题】:OperationalError, no such column. Django 【发布时间】:2014-12-06 09:05:25 【问题描述】:

我对 django 非常陌生,并且能够在 djangoproject.com 上完成教程而没有任何错误。我现在正在阅读位于http://www.django-rest-framework.org/ 的 Django REST 框架教程 我几乎完成了它,只是添加了身份验证。现在我得到了:

OperationalError at /snippets/
no such column: snippets_snippet.owner_id
Request Method: GET
Request URL:    http://localhost:8000/snippets/
Django Version: 1.7
Exception Type: OperationalError
Exception Value:    
no such column: snippets_snippet.owner_id
Exception Location: /Users/taylorallred/Desktop/env/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py in execute, line 485
Python Executable:  /Users/taylorallred/Desktop/env/bin/python
Python Version: 2.7.5
Python Path:    
['/Users/taylorallred/Desktop/tutorial',
 '/Users/taylorallred/Desktop/env/lib/python27.zip',
 '/Users/taylorallred/Desktop/env/lib/python2.7',
 '/Users/taylorallred/Desktop/env/lib/python2.7/plat-darwin',
 '/Users/taylorallred/Desktop/env/lib/python2.7/plat-mac',
 '/Users/taylorallred/Desktop/env/lib/python2.7/plat-mac/lib-scriptpackages',
 '/Users/taylorallred/Desktop/env/Extras/lib/python',
 '/Users/taylorallred/Desktop/env/lib/python2.7/lib-tk',
 '/Users/taylorallred/Desktop/env/lib/python2.7/lib-old',
 '/Users/taylorallred/Desktop/env/lib/python2.7/lib-dynload',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
 '/Users/taylorallred/Desktop/env/lib/python2.7/site-packages']
Server time:    Sat, 11 Oct 2014 07:02:34 +0000

我在网上找了几个地方,不仅仅是 *** 的解决方案,似乎一般是我的数据库有问题,需要删除它然后重新制作,我已经做了好几次了,教程甚至让我删除数据库并重新制作它。 这是我的models.py

from django.db import models
from pygments.lexers import get_all_lexers
from pygments.styles import get_all_styles
from pygments.lexers import get_lexer_by_name
from pygments.formatters.html import HtmlFormatter
from pygments import highlight


LEXERS = [item for item in get_all_lexers() if item[1]]
LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS])
STYLE_CHOICES = sorted((item, item) for item in get_all_styles())



class Snippet(models.Model):
    owner = models.ForeignKey('auth.User', related_name='snippets')
    highlighted = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100, blank=True, default='')
    code = models.TextField()
    linenos = models.BooleanField(default=False)
    language = models.CharField(choices=LANGUAGE_CHOICES,
                                            default='python',
                                            max_length=100)
    style = models.CharField(choices=STYLE_CHOICES,
                                     default='friendly',
                                     max_length=100)
    class Meta:
        ordering = ('created',)
def save(self, *args, **kwargs):
    """
    Use the 'pygments' library to create a highlighted HTML
    representation of the code snippet.
    """
    lexer = get_lexer_by_name(self.language)
    linenos = self.linenos and 'table' or False
    options = self.title and 'title': self.title or 
    formatter = HtmlFormatter(style=self.style, linenos=linenos,
                                      full=true, **options)
    self.highlighted = highlight(self.code, lexer, formatter)
    super(Snippet, self).save(*args, **kwargs)

我的serializers.py

from django.forms import widgets
from rest_framework import serializers
from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES
from django.contrib.auth.models import User



class SnippetSerializer(serializers.ModelSerializer):
    owner = serializers.Field(source='owner.username')
    class Meta:
        model = Snippet
        fields = ('id', 'title', 'code', 'linenos', 'language', 'style', 'owner')


class UserSerializer(serializers.ModelSerializer):
    snippets = serializers.PrimaryKeyRelatedField(many=True)


    class Meta:
        model = User
        fields = ('id', 'username', 'snippets')

我的views.py

from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework import generics
from django.contrib.auth.models import User
from snippets.serializers import UserSerializer
from rest_framework import permissions

class SnippetList(generics.ListCreateAPIView):
    """
    List all snippets, or create a new snippet.
    """
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer
    def pre_save(self, obj):
        obj.owner = self.request.user
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
    """
    Retrieve, update or delete a nippet instance.
    """
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer
    def pre_save(self, obj):
        obj.owner = self.request.user
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

class UserList(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

class UserDetail(generics.RetrieveAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

最后是我的urls.py

from django.conf.urls import include
from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns
from snippets import views


urlpatterns = patterns('',
    url(r'^snippets/$', views.SnippetList.as_view()),
    url(r'^snippets/(?P<pk>[0-9]+)/$', views.SnippetDetail.as_view()),
    url(r'^users/$', views.UserList.as_view()),
    url(r'^users/(?P<pk>[0-9]+)/$', views.UserDetail.as_view()),
)

urlpatterns = format_suffix_patterns(urlpatterns)

urlpatterns += patterns('',
    url(r'^api-auth/', include('rest_framework.urls',
                                       namespace='rest_framework')),
)

如果我发布了一堆不必要的信息,我深表歉意。在此先感谢各位。

编辑: 数据库架构:

CREATE TABLE "snippets_snippet" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, 
"created" datetime NOT NULL, "title" varchar(100) NOT NULL, "code" text NOT NULL, 
"linenos" bool NOT NULL, "language" varchar(100) NOT NULL, "style" varchar(100) NOT NULL);

在进行了一些挖掘之后,我发现在删除和重新创建数据库时(如教程所述)而不是使用 make migrations 命令,它不仅不会添加列,而且它也不会告诉我出现问题时运行make migrations 命令它告诉我:

You are trying to add a non-nullable field 'highlighted' to snippet without a default;
we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows)
 2) Quit, and let me add a default in models.py

如果我注释掉models.py 中的highlighted 部分,它将在上面发布相同的消息,但针对owner 行。所以它想要highlightedowner 的默认值,但我不确定该使用什么。以及教程对我也没有帮助。

【问题讨论】:

如果您删除了 db 并重新运行了 syncdb,我不希望您遇到这个问题。你确定你删除了正确的 SQLite db 文件吗? 我赞成你的问题,不是因为问题本身,而是因为你所尝试的细节的彻底性和坦率。精心提出的问题并不常见。不幸的是,我在移动设备上,无法给出适当的回应。还是祝你好运。我稍后再回来看看事情进展如何 我不知道我可能删除了错误的数据库。我每次运行命令rm tmp.db,然后运行python manage.py syncdb,它会提示我创建一个超级用户。我在完成项目其余部分的同一终端选项卡中执行此操作,同时也在同一环境中。 那么其他任何机构都有可能的解决方案吗? 我也有这个问题,无法解决。克隆教程 git 并运行同步似乎会在 sqllite 中创建 owner_id 字段,但我无法通过教程完成它。 【参考方案1】:

在阅读本教程时,您一定遇到过关于迁移的部分,因为这是 Django 1.7 的主要变化之一

在 Django 1.7 之前,syncdb 命令从未进行任何有机会破坏数据库中当前数据的更改。这意味着,如果您为模型执行了 syncdb,然后向模型添加了一个新行(实际上是一个新列),syncdb 不会影响数据库中的该更改。

因此,要么您手动删除该表,然后再次运行 syncdb(从头开始重新创建它,丢失任何数据),要么您在数据库中手动输入正确的语句以仅添加该列。

然后出现了一个名为 south 的项目,该项目实施了迁移。这意味着有一种方法可以向前迁移(以及反向、撤消)对数据库的任何更改并保持数据的完整性。

在 Django 1.7 中,south 的功能直接集成到 Django 中。使用迁移时,过程有点不同。

    更改models.py(正常)。 创建迁移。这会生成代码以从模型的当前状态转到下一个状态。这是通过makemigrations 命令完成的。这个命令足够聪明,可以检测到发生了什么变化,并会创建一个脚本来影响数据库的变化。 接下来,您使用migrate 应用该迁移。此命令按顺序应用所有迁移。

因此,您的正常syncdb 现在是一个两步过程,python manage.py makemigrations 然后是python manage.py migrate

现在,谈谈您的具体问题:

class Snippet(models.Model):
    owner = models.ForeignKey('auth.User', related_name='snippets')
    highlighted = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100, blank=True, default='')
    code = models.TextField()
    linenos = models.BooleanField(default=False)
    language = models.CharField(choices=LANGUAGE_CHOICES,
                                            default='python',
                                            max_length=100)
    style = models.CharField(choices=STYLE_CHOICES,
                                     default='friendly',
                                     max_length=100)

在此模型中,您有两个字段 highlightedcode 是必需的(它们不能为空)。

如果您从一开始就添加了这些字段,不会因为表没有现有行而出现问题吗?

但是,如果表已经创建并且您添加了一个不能为空的字段,您必须定义一个默认值以提供任何现有的行 - 否则,数据库将不会接受您的更改,因为它们会违反数据完整性约束。

这就是命令提示您的内容。您可以告诉 Django 在迁移期间应用默认值,或者您可以在模型本身中给它一个“空白”默认值highlighted = models.TextField(default='')

【讨论】:

你说的有道理,但是,如果我删除表,它不应该也解决问题吗?因为我要重新创建表格,所以这些字段从一开始就在那里?但在实践中(至少当我这样做时,我认为我做得对......)它仍然不起作用,但是现在,当我运行 makemigrations 命令时,它说一切都很好并且“没有变化检测到”,但是当我进入 shell 并查看 db 架构时,它仍然没有显示 ownerhighlighted 字段。 如果删除了表,需要重新迁移。在你的应用中应该有一个名为 migrations 的文件夹,看看有多少个迁移。 教程声明实际上删除了 sqlite 文件,然后运行 ​​syncdb 重新创建它。即使在这种情况下,该字段也没有在 sn-ps_sn-p 表中创建。 所以目前我模型中的字段看起来像 owner = models.ForeignKey('auth.User', related_name='snippets')highlighted = models.TextField() 他们应该看起来像 owner = models.ForeignKey('auth.User', related_name='snippets', default='')highlighted = models.TextField(default='') 吗? 好的,到目前为止,它似乎工作正常,我完成了对上一条评论中的字段的更改。在最低限度,它让我继续学习教程并且没有给我任何错误,仍然不能 %100 确定这是否完全解决了问题,但到目前为止还不错。如果我遇到与此问题一致的任何其他问题,我将在此处发布更新,否则如果我有另一个我无法解决的问题,我将发布另一个问题。感谢大家的帮助!【参考方案2】:

让我们关注错误:

异常值: 没有这样的列:sn-ps_sn-p.owner_id

让我们看看这是不是真的......

您可以使用manage.py 命令来access your db shell(这将使用settings.py 变量,所以您一定要连接到正确的)。

manage.py dbshel​​l

您现在可以通过键入以下内容来显示表格的详细信息:

.schema TABLE_NAME

或者在你的情况下:

.schema sn-ps_sn-p

更多 sqlite 命令可以在here 或通过发出:

.帮助

最后,键入以下内容结束会话:

.退出

这不会让你走出困境,但它可以帮助你了解问题的最终结果:)

祝你好运!

【讨论】:

非常感谢您向我展示了如何访问 sqlite shell(或任何已配置的 shell)......非常棒,不知道为什么我没有早点了解这一点。 ..谢谢!【参考方案3】:

第 1 步:删除 db.sqlite3 文件。

第 2 步:$ python manage.py 迁移

第 3 步:$ python manage.py makemigrations

第四步:使用 $ python manage.py createsuperuser 创建超级用户

新的 db.sqlite3 会自动生成

【讨论】:

你救了我的命哈哈谢谢【参考方案4】:

我看到我们在这里遇到了同样的问题,我也遇到了同样的错误。我想为将来遇到同样错误的用户写这篇文章。 像@Burhan Khalid 所说的那样对您的类 Snippet 模型进行更改后,您必须迁移表:

python manage.py makemigrations snippets
python manage.py migrate

这应该可以解决错误。 享受吧。

【讨论】:

【参考方案5】:

如果您实例化依赖于该表的类(例如在 views.py 中),则可能会发生此错误。

【讨论】:

非常有帮助 - 如果可以的话,我会给你更多的 +1。我正在练习使用 Django 模型创建对象,并在 views.py 中手动实例化了一些类实例,而不是通过表单提交等。一旦我删除了这些创建事件,我就能够在 makemigrationsmigrate 没有django.db.utils.OperationalError: table project_app has no column named field_trying_to_add 错误。谢谢! 你能解释更多吗? @istiaque-ahmed 当我在整个应用程序级别使用模型实例化一个类时,我发生了这个错误。迁移机制无法在运行时检查属性,也无法对特定模型/表执行更改。【参考方案6】:

最初,我已经注释了导致这些错误的新字段,然后运行 ​​python manage.py makemigrations 然后 python manage.py migrate 以实际删除这些新字段字段。

class FootballScore(models.Model):
    team = models.ForeignKey(Team, related_name='teams_football', on_delete=models.CASCADE)
    # match_played = models.IntegerField(default='0')
    # lose = models.IntegerField(default='0')
    win = models.IntegerField(default='0')
    # points = models.IntegerField(default='0')

class FootballScore(models.Model):
    team = models.ForeignKey(Team, related_name='teams_football', on_delete=models.CASCADE)
    match_played = models.IntegerField(default='0')
    lose = models.IntegerField(default='0')
    win = models.IntegerField(default='0')
    points = models.IntegerField(default='0')

然后我重新取消注释它们并运行 python manage.py makemigrationspython manage.py migrate 并繁荣。它对我有用。 :)

【讨论】:

被低估的答案。 为我工作!谢谢,也许是那些导致问题的依赖项。【参考方案7】:

我遇到了这个问题,这就是我解决它的方法。

1) 从应用的迁移目录中删除所有迁移记录。这些是名为 0001_,0002_,0003_ 等的文件。注意不要删除 _init__.py 文件。

2) 删除 db.sqlite3 文件。稍后会重新生成。

现在,运行以下命令:

python manage.py makemigrations appname
python manage.py migrate

请务必在 makemigrations 之后写下您的应用名称。您可能必须创建一个超级用户才能再次访问您的数据库。通过以下方式进行操作

python manage.py createsuperuser

【讨论】:

感谢您在进行迁移时声明 appname 也是必需的。这有帮助。【参考方案8】:

解决此类问题最直接的方法就是以下三个步骤:

    从应用的迁移文件夹/目录中删除所有与迁移相关的文件(这些基本上以000100020003 等开头)。

    从 App 目录中删除/重命名名为 db.sqlite3 的现有数据库文件。

    现在运行以下命令:

    python manage.py migrate

    最终执行

    python manage.py createsuperuser

    执行管理任务(如果需要)。

【讨论】:

真希望有更快的方法来做到这一点。再说一遍,你可以编写一个脚本来自动化这个过程【参考方案9】:

你做的每件事都是正确的,我也遇到了同样的问题。 首先删除你的数据库和迁移 我解决了我在makemigrations 中添加应用程序的名称:

python manage.py makemigrations appname
python manage.py migrate

这肯定会奏效。

【讨论】:

假设它是mysql db 而不是sqlite3?【参考方案10】:

我做了以下

    删除我的 db.sqlite3 数据库 python manage.py makemigrations python manage.py migrate

它更新了数据库并修复了问题,而不影响我的项目。请注意,您可能需要执行python manage.py createsuperuser,因为它会影响您正在创建的所有对象。

【讨论】:

【参考方案11】:

1.首先从迁移文件中只删除0001_initial.py

2.删除dbsqulite文件

3.python manage.py makemigrations appname

4.python manage.py 迁移

终于解决了

【讨论】:

【参考方案12】:

取自 Burhan Khalid 的回答和他对迁移的评论:对我有用的是删除“迁移”文件夹的内容以及数据库,然后运行 ​​manage.py migrate。删除数据库是不够的,因为迁移文件夹中保存了有关表结构的信息。

【讨论】:

【参考方案13】:

同意瑞诗凯诗。我也试图解决这个问题很长时间。这将通过两种方法中的一种或两种方法解决-

1.尝试删除应用迁移文件夹中的迁移(init.py除外) 然后运行 ​​makemigrations 命令

2.如果这不起作用,请尝试重命名模型(这是最后的手段,可能会有点混乱,但肯定会工作。如果 django 询问“你重命名模型了吗?只需按 N。”) .希望它有所帮助..:)

【讨论】:

【参考方案14】:

您没有迁移在模型中所做的所有更改。所以 1)python manage.py makemigrations 2)python manage.py migrate 3)python manag.py runserver 它工作 100%

【讨论】:

【参考方案15】:

这可能是最烦人和最耗时的问题之一,回溯对解决问题没有帮助。

当我们尝试连接模型时,基本上有两种方式:

第一个

from comments.models import Comment

class Article(models.Model):
    comments = models.ManyToManyField(Comment)

第二个

class Article(models.Model):
    comments = models.ManyToManyField('comments.Comment')

第一种方法,初学者广泛使用,它可能会导致循环导入问题,当您尝试在B.py 中导入A.py 时会发生这种情况,在B.py 中它也会导入@987654326 @。

因此,我们必须放弃第一种方法,而实施第二种方法。这是解决问题的方法,不幸的是您需要删除数据库。

删除db.sqlite3 对于所有应用,打开migration文件夹,删除除__init__.py之外的所有应用 python manage.py makemigrations python manage.py migrate

一个问题解决了,如果你遵守约定,这个问题就不会再发生了:

不要导入模型,无论您身在何处,始终使用它:
from django.apps import apps
apps.get_model(app_name, model_name)
# Article = apps.get_model('articles', 'Article')

在字段中可以简述为字符串,&lt;app_name&gt;_&lt;model_name&gt;

class Article(models.Model):
    comments = models.ManyToManyField('comments.Comment')

这是一个删除所有迁移的脚本,创建一个文件clean.pymanage.py同级

import os


def recursor(dirpath):
    # print(dirpath)
    delfiles = []
    deldirs = []
    with os.scandir(dirpath) as l1:
        for e1 in l1:
            if not e1.is_file():
                with os.scandir(e1.path) as l2:
                    for e2 in l2:
                        if e2.name == 'migrations':
                            with os.scandir(e2.path) as l3:
                                for e3 in l3:
                                    if not e3.name == '__init__.py':
                                        print(e3.path)
                                        if e3.is_file():
                                            delfiles.append(e3.path)
                                        else:
                                            deldirs.append(e3.path)
                                            with os.scandir(e3.path) as l4:
                                                for e4 in l4:
                                                    delfiles.append(e4)
    yn = input('are you sure to delete all the files above?(y/n)')
    if yn == 'y':
        for dp in delfiles:
            os.remove(dp)
        for dp in deldirs:
            os.rmdir(dp)



recursor(os.path.dirname(os.path.realpath(__file__)))

【讨论】:

【参考方案16】:

如果您的问题与我的类似,那么这是一种解决方法。 好消息是您不必删除数据库。

检查是否没有其他模型将此模型用作参考。

django.db.utils.OperationalError: no such column: parts_part_type.blah

这只是发生在我身上,因为我在另一个名为“products”的应用中有另一个名为“product”的模型引用了这个模型。

part = models.ForeignKey("parts.Part", related_name="some part", limit_choices_to='part_type':Part_Type.objects.get(prefix='PART'),)

我的解决方案是:

    settings.py 中注释掉另一个应用程序(在本例中为产品) python manage.py makemigrations; python manage.py migrate 取消注释其他应用,使其再次启用。 python manage.py makemigrations; python manage.py migrate

从技术上讲,我认为我需要更改 limit_choices_to 引用所以

【讨论】:

所以这是一个 django 错误,它不是由不正确的用户行为引起的【参考方案17】:

我最近遇到了这个问题,即使在不同的教程中。我有 django 版本 2.2.3 所以我认为我不应该有这种问题。 在我的例子中,一旦我向模型添加一个新字段并尝试在admin 中访问它,它会说no such column。 经过三天寻找解决方案但没有任何效果,我学会了“正确”的方法。 首先,如果您要更改模型,您应该确保服务器没有运行。这就是导致我自己的问题的原因。 而这并不容易纠正。我不得不重命名该字段(当服务器未运行时)并重新应用迁移。 其次,我发现python manage.py makemigrations &lt;app_name&gt; 捕获了变化,而不仅仅是python manage.py makemigrations。我不知道为什么。 您也可以使用python manage.py migrate &lt;app_name&gt; 跟进。我很高兴我自己发现了这一点。

【讨论】:

【参考方案18】:

请记住,迁移文件夹中隐藏了一个 pycache 文件夹,因此如果您更改模型并删除所有迁移文件,您还必须删除 pycache 文件夹。

您唯一不应该删除的是您的 init 文件。

希望对你有帮助

【讨论】:

【参考方案19】:

就我而言,在admin.py 中,我从添加了新ForeignKey 字段的表中进行查询。所以注释掉 admin.py 然后像往常一样运行 makemigrations 和 migrate 命令。最后取消注释admin.py

【讨论】:

【参考方案20】:

如果按照@Burhan Khalid 所说的操作后错误仍然存​​在

试试这一行:python manage.py migrate --run-syncdb

【讨论】:

请正确格式化代码,click here to learn how。另外,不要将您的答案链接到其他人的答案,因为它可以被删除,一旦您有足够的 [reputation](***.com/help/),您可以留下 [comment](***.com/help/privileges/comment)什么声誉)。【参考方案21】:

任何人来这里:

删除所有迁移 删除 db.sqlite 文件

重做迁移

【讨论】:

【参考方案22】:

我只是犯了一个粗心的错误,在进行迁移后忘记实际应用迁移(迁移)。写这个以防万一有人犯同样的错误。

【讨论】:

【参考方案23】:

我认为您跳过了这一步...运行以下命令以查看您是否忘记执行它们...它对我有用。

$ python manage.py makemigrations

$ python manage.py 迁移

谢谢。

【讨论】:

有人已经回答了这个答案。你的回答增加了什么? 它似乎是相同的或只是this、this、this、this 和this 的子集【参考方案24】:

删除 django 应用程序的迁移文件夹中的所有迁移,然后运行 ​​makemigrations 和迁移命令。你应该能够走出困境。

【讨论】:

【参考方案25】:

我对 sqlite 有同样的问题。我的 models.py 看起来还不错。我做了以下事情:

sqlite3 db.sqlite3
.tables
PRAGMA table_info(table_name);

通过 PRAGMA 我能够看到表中缺少列失败。 我删除了应用程序中的所有表格。请小心,因为这会丢失表格中的数据。

DROP table table_name
.quit

然后这样做:

python manage.py makemigrations your_app
python manage.py migrate your_app
python manage.py sqlmigrate your_app 0001

然后如下再次进入sqlite,粘贴你从sqlimigrate得到的所有代码:

sqlite3 db.sqlite3

例如,这是我在 sqlite 中粘贴的内容:

CREATE TABLE "adpet_ad" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(200) NOT NULL, "breed" varchar(30) NULL, "weight" decimal NULL, "age" integer NULL, "text" text NOT NULL, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL, "picture" BLOB NULL, "content_type" varchar(256) NULL, "name" varchar(100) NULL, "phone" varchar(31) NOT NULL, "gender_id" integer NULL REFERENCES "adpet_gender" ("id") DEFERRABLE INITIALLY DEFERRED, "owner_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED, "size_id" integer NULL REFERENCES "adpet_size" ("id") DEFERRABLE INITIALLY DEFERRED, "specie_id" integer NULL REFERENCES "adpet_specie" ("id") DEFERRABLE INITIALLY DEFERRED, "sterilized_id" integer NULL REFERENCES "adpet_sterilized" ("id") DEFERRABLE INITIALLY DEFERRED, "vaccinated_id" integer NULL REFERENCES "adpet_vaccinated" ("id") DEFERRABLE INITIALLY DEFERRED);

【讨论】:

【参考方案26】:

不要像某些人所说的那样删除任何现有的迁移,而是这样做:

python manage.py migrate --fake #(only if the below commands don't work)
python manage.py migrate --run-syncdb
python manage.py runserver makemigrations
python manage.py runserver

【讨论】:

【参考方案27】:

我添加这个是因为,如果您的问题仍然存在,则可能是您试图在类的 init 函数中访问数据库。 makemigrations 进程会检查您的所有模块和类,如果您尝试在 init 函数中访问数据库中的表,它可能会引发错误。注释掉该行,然后尝试 makemigrations 和 migrate

【讨论】:

【参考方案28】:

每当您添加新字段时,您也需要在数据库中进行更改,因此您需要运行一些命令来添加新列

python manage.py makemigrations
python manage.py migrate
python manage.py runserver

如果仍然无法正常工作,请删除名称以 00 开头的类似名称的迁移文件,然后从上面运行相同的命令。如果它仍然无法正常工作。从项目中删除 SQLite 数据库并再次运行这些命令

【讨论】:

【参考方案29】:

好吧,我不能特别谈到问题的 db 方面或答案......我尝试删除 0001_initial.py 但错误仍然存​​在。

所以对于你们(我们)中遇到“no such column: sn-ps_sn-p.owner_id”类型的 django 错误(不一定是 REST),问题出在外键变量,它需要一个未指定的默认值。

解决方案:将default='' 添加到外键参数中,就可以了。有关此人代码的上下文; owner = models.ForeignKey('auth.User', related_name='snippets', default='')

【讨论】:

【参考方案30】:

我也面临同样的问题。

如果您要添加一个新字段,那么它会给出错误,因为找不到列。

然后你应用make migration 命令,然后应用migrate 命令 然后还是一样的错误.. 比如...

 path=models.FilePathField()

为字段添加默认值

  path=models.FilePathField(default='')

然后应用命令

  python manage.py makemigrations

  python manage.py migrate

也许对你有帮助

【讨论】:

以上是关于OperationalError,没有这样的列。姜戈的主要内容,如果未能解决你的问题,请参考以下文章

django.db.utils.OperationalError:(1052,“字段列表中的列'名称'不明确”)

sqlalchemy.exc.OperationalError:(sqlite3.OperationalError)没有这样的表:mytable

OperationalError:没有这样的表

django:sqlite3.OperationalError:没有这样的表

Django / sqlite3“OperationalError:没有这样的表”关于线程操作

OperationalError:没有这样的表:django_content_type 和 django_session