OperationalError, no such column. Django
OperationalError, no such column. Django
我正在学习Django REST框架的教程,网址是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[0-9]+)/$', views.SnippetDetail.as_view()), url(r'^users/$', views.UserList.as_view()), url(r'^users/(?P [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
两个字段的默认值,但是我不确定该使用什么作为默认值。而且教程也没有帮助我解决这个问题。