【问题标题】:OperationalError, no such column. DjangoOperationalError,没有这样的列。姜戈
【发布时间】: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

我在网上找了几个地方,不仅仅是 StackOverflow 的解决方案,似乎一般是我的数据库有问题,需要删除它然后重新制作,我已经做了好几次了,教程甚至让我删除数据库并重新制作它。 这是我的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 行。所以它想要highlighted 和owner 的默认值,但我不确定该使用什么。以及教程对我也没有帮助。

【问题讨论】:

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

标签: python django django-rest-framework


【解决方案1】:

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

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

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

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

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

  1. 更改models.py(正常)。
  2. 创建迁移。这会生成代码以从模型的当前状态转到下一个状态。这是通过makemigrations 命令完成的。这个命令足够聪明,可以检测到发生了什么变化,并会创建一个脚本来影响数据库的变化。
  3. 接下来,您使用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)

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

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

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

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

【讨论】:

  • 你说的有道理,但是,如果我删除表,它不应该也解决问题吗?因为我要重新创建表格,所以这些字段从一开始就在那里?但在实践中(至少当我这样做时,我认为我做得对......)它仍然不起作用,但是现在,当我运行 makemigrations 命令时,它说一切都很好并且“没有变化检测到”,但是当我进入 shell 并查看 db 架构时,它仍然没有显示 owner 或 highlighted 字段。
  • 如果删除了表,需要重新迁移。在你的应用中应该有一个名为 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 中手动实例化了一些类实例,而不是通过表单提交等。一旦我删除了这些创建事件,我就能够在 makemigrations 和 migrate 没有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 makemigrations 和 python 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】:

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

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

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

    3. 现在运行以下命令:

      python manage.py migrate

      最终执行

      python manage.py createsuperuser

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

    【讨论】:

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

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

    python manage.py makemigrations appname
    python manage.py migrate
    

    这肯定会奏效。

    【讨论】:

    • 假设它是mysql db 而不是sqlite3?
    【解决方案10】:

    我做了以下

    1. 删除我的 db.sqlite3 数据库
    2. python manage.py makemigrations
    3. 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.py与manage.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')},)
                

                我的解决方案是:

                1. 从 settings.py 中注释掉另一个应用程序(在本例中为产品)
                2. python manage.py makemigrations; python manage.py migrate
                3. 取消注释其他应用,使其再次启用。
                4. 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](stackoverflow.com/help/),您可以留下 [comment](stackoverflow.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
                                      

                                      也许对你有帮助

                                      【讨论】:

                                        猜你喜欢
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 2015-02-25
                                        • 2020-08-16
                                        • 2020-12-01
                                        • 2021-01-12
                                        • 2021-01-27
                                        • 2016-06-29
                                        相关资源
                                        最近更新 更多