8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

OperationalError,没有这样的列。Django

Juraj 2月前

235 0

我正在学习 http://www.django-rest-framework.org/ 上的 Django REST 框架教程,我几乎完成了它并刚刚添加了身份验证。现在我得到了 :OperationalError ...

我正在学习 http://www.django-rest-framework.org/ ,我几乎完成了它,并且刚刚添加了身份验证。现在我得到:

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

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

帖子版权声明 1、本帖标题:OperationalError,没有这样的列。Django
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Juraj在本站《database》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 如果您删除了数据库并重新运行 syncdb,我认为您不会遇到此问题。您确定删除了正确的 SQLite 数据库文件吗?

  • 我赞同你的问题,不是因为问题本身,而是因为你尝试过的细节和直白。精心设计的问题并不常见。不幸的是,我在手机上,无法给出适当的回答。不过祝你好运。我稍后会再回来查看事情进展如何

  • 我也遇到过这个问题,但没能解决。克隆教程 git 并运行 sync 似乎会在 sqllite 中创建owner_id 字段,但我无法让它按照教程操作。

  • 在学习本教程时,你一定遇到过有关迁移的部分,因为这是 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 并查看数据库模式时,它仍然没有显示所有者或突出显示的字段。

  • 如果您删除了表,则需要再次迁移。您的应用程序中应该有一个名为 migrations 的文件夹,查看有多少个迁移。

  • 教程中说要删除 sqlite 文件,然后运行 ​​syncdb 重新创建它。即使在这种情况下,该字段也没有在 snippets_snippet 表中创建。

  • 所以目前我的模型中的字段看起来像owner = models.ForeignKey('auth.User', related_name='snippets')和highlighted = models.TextField()它们应该看起来像owner = models.ForeignKey('auth.User', related_name='snippets', default='')和highlighted = models.TextField(default='')吗?

  • 引用 10

    好的,到目前为止,它似乎正在工作,我完成了对之前发布的评论中字段的更改。至少它允许我继续本教程并且没有给我任何错误,仍然不能 100% 确定这是否完全解决了问题,但到目前为止一切顺利。如果我以后遇到与此问题相关的任何其他问题,我会在这里发布更新,否则如果我有另一个我无法解决的问题,我会发布另一个问题。感谢大家的帮助!

  • 引用 11

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

    步骤 2:$ python manage.py migration

    步骤 3:$ python manage.py makemigrations

    步骤 4:使用 $ python manage.py createsuperuser 创建超级用户

    新的 db.sqlite3 将自动生成

  • 引用 12

    我必须指定 python manage.py makemigrations 片段

  • 这解决了我的问题哈哈>>>步骤 1:删除 db.sqlite3 文件。

  • 此解决方案是否仅与 Sqlite3 相关?如果我们使用 PostgreSQL 进行生产怎么办?在这种情况下,删除整个数据库似乎不是一个好主意。

  • TEK 2月前 0 只看Ta
    引用 15

    让我们集中讨论一下错误:

    异常值:没有这样的列:snippets_snippet.owner_id

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

    您可以使用 manage.py 命令 访问您的 db shell (这将使用 settings.py 变量,因此您确保连接到正确的变量)。

    manage.py dbshell

    您现在可以通过输入以下命令来显示表的详细信息:

    .schema TABLE_NAME

    或者就你的情况而言:

    .schema snippets_snippet

    可以 在此处 ,或者通过发出以下命令:

    .help

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

    .quit

    这并不能让你脱离困境,但它可以帮助你知道要解决问题的最终结果:)

    祝你好运!

  • 非常感谢您向我展示如何访问 sqlite shell(或任何配置的 shell)...非常棒,不知道为什么我没有早点了解这一点...谢谢!

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

    python manage.py makemigrations snippets
    python manage.py migrate
    

    这样应该就可以解决错误了。尽情享受吧。

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

    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 migration ,然后就成功了。对我来说很管用。:)

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

  • 非常有帮助 - 如果可以的话,我会给你更多 +1。我正在练习使用 Django 模型创建对象,并在 views.py 中手动实例化了一些类实例,而不是通过表单提交等。一旦我删除了这些创建事件,我就可以进行迁移并迁移,而不会出现 django.db.utils.OperationalError:表 {{project}}_{{app}} 没有名为 {{field_trying_to_add}} 的列错误。谢谢!

返回
作者最近主题: