OperationalError,没有这样的列.Django的

Tay*_*red 35 python django django-rest-framework

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

我已经在网上找了几个地方,而不仅仅是解决方案的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)
Run Code Online (Sandbox Code Playgroud)

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

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

最后我的 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')),
)
Run Code Online (Sandbox Code Playgroud)

如果我发布了一堆不必要的信息,我道歉.先谢谢你们.

编辑:DB架构:

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

在做了一些挖掘后,我发现当删除并重新创建db(如教程所说)而不是使用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
Run Code Online (Sandbox Code Playgroud)

如果我注释掉它中的highlighted部分models.py将在上面发布相同的消息,但是对于该owner行.因此,希望两个默认的highlightedowner,但我不知道,因为它使用什么.除了教程也没有帮助我.

Bur*_*lid 40

在阅读本教程时,您必须遇到有关迁移的部分,因为这是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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

这是命令提示您的内容.您可以告诉django在迁移期间应用默认值,或者您可以highlighted = models.TextField(default='')在模型本身中为其指定"空白"默认值.


小智 8

让我们关注错误:

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

让我们看看是否真的......

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

manage.py dbshell

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

.schema TABLE_NAME

或者在你的情况下:

.schema snippets_snippet

可以在此处找到更多sqlite命令,或者发出以下命令:

.help

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

.quit

这不会让你走出困境,但它可以帮助你知道问题的终结:)

祝好运!


小智 8

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

第 2 步:$ python manage.py migrate

第 3 步:$ python manage.py makemigrations

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

新的 db.sqlite3 会自动生成


mar*_*arw 7

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

  • *非常有帮助* - 如果可以的话,我会给你更多的 +1。我正在练习使用 Django 模型创建对象,并在 `views.py` 中手动实例化了一些类实例,而不是通过表单提交等。一旦我删除了这些创建事件,我就能够进行 `makemigrations` 和 `migrate ` 没有 `django.db.utils.OperationalError: table {{project}}_{{app}} has no column named {{field_trying_to_add}}` 错误。谢谢你! (4认同)

cop*_*ser 6

我看到我们在这里有同样的问题,我有同样的错误.我想为将来会遇到同样错误的用户写这个.在改变你的类Snippet模型之后,像@Burhan Khalid所说,你必须迁移表:

python manage.py makemigrations snippets
python manage.py migrate
Run Code Online (Sandbox Code Playgroud)

这应该可以解决错误.请享用.


Aad*_*oda 6

最初,我评论了导致这些错误的新字段,然后运行python manage.py makemigrationspython 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')
Run Code Online (Sandbox Code Playgroud)

然后我刚刚取消注释它们并运行python manage.py makemigrationspython manage.py migrate和boom。它对我有用。:)

  • 被低估的答案。 (3认同)

hyg*_*ull 5

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

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

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

  3. 现在运行以下命令:

    python manage.py migrate

    最后执行

    python manage.py createsuperuser

    执行管理任务(如果您愿意)。


May*_*nna 5

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

1) 删除应用程序迁移目录中的所有迁移记录。这些文件名为 0001_、0002_、0003_ 等。请小心不要删除 _init__.py 文件。

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

现在,运行以下命令:

python manage.py makemigrations appname
python manage.py migrate
Run Code Online (Sandbox Code Playgroud)

请务必在 makemigrations 之后写下您的应用程序的名称。您可能必须创建一个超级用户才能再次访问您的数据库。请按以下步骤操作

python manage.py createsuperuser
Run Code Online (Sandbox Code Playgroud)