OperationalError,无此列。Django的

TaylorAllred:

我是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

如果我将其中的highlighted部分注释掉models.py,则会在上方发布相同的消息,但仅用于该owner行。因此,它想同时为highlighted设置默认值owner,但是我不确定该使用什么。不仅如此,本教程也无济于事。

Burhan Khalid:

在学习本教程的过程中,您肯定遇到了有关迁移的部分,因为这是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这是必填字段(它们不能为null)。

您是否从一开始就添加了这些字段,因为表没有现有的行,这不会有问题吗?

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

这是命令提示您的内容。您可以告诉Django在迁移过程中应用默认值,也可以highlighted = models.TextField(default='')在模型本身中为其指定“空白”默认值

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Django中自动填充用户字段(无此列)

错误:SQLITE_ERROR:无此列:undefined

Android Studio SQLite错误:“无此列。”

Django tutorial01 OperationalError:无此类列:polls_choice.question_text_id

Django在单独的数据库上进行测试,给出“ OperationalError:无此类表:auth_user”

如何修复“ django.db.utils.OperationalError:在“无”附近:语法错误” db.sqlite3?

位于:“站点”的OperationalError异常值:无此类表django_site

OperationalError:无此类表:条目

使用SQLite从数据库中选择-“无此列”

Django:/ admin /中的OperationalError

Django OperationalError: no such column: on pythonanywhere

Python / SQLITE-OperationalError:无此类模块:RTREE

使用sqlite OperationalError创建函数:无此类列

Android Room和POJO上的多个@Embedded字段出现“无此列” SQL错误

更新列的值时,我在sqlite3中遇到“无此列”错误

当我看到该列存在时,SQLite错误“无此列”

refSQL()无法处理基于表达式的条件?(数据库查询错误“无此列”)

Django:无反向匹配

Django Post或无

Django Authenticate返回无

Django OperationalError:没有此类列

Django:OperationalError没有这样的表

SQLite3和Python 3-使用字符串但没有整数的“无此列”错误

管理 Django Rest Framework (DRF) 中的 Python/Django 'OperationalError'

django-HttpResponse 返回无

Django:DeclarativeFieldsMetaclass的字段(无实例)

Django对锚标记无响应

“无”显示对象Django的名称

django迁移无迁移申请