私はDjangoが初めてで、エラーなしでdjangoproject.comのチュートリアルを完了することができました。現在、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<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')),
)
_
たくさんの不要な情報を投稿してしまったことをおaびします。事前に感謝します。
編集: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);
_
掘り下げた後、_make migrations
_コマンドを使用する代わりにDBを削除して再作成すると(チュートリアルの説明どおり)、列を追加するだけでなく、実行中に問題が発生したこともわかりません_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
の両方にデフォルトが必要ですが、それをどのように使用するかはわかりません。チュートリアルと同じように私も助けてくれません。
チュートリアルを進めていくと、Django 1.7
Django 1.7より前は、syncdbコマンドは、データベース内の現在のデータを破壊する可能性のある変更を一切行いませんでした。つまり、モデルに対してsyncdbを実行し、モデル(事実上、新しい列)、syncdbはデータベースのその変更に影響しません。
そのため、そのテーブルを手動で削除してからsyncdbを再度実行して(ゼロから再作成し、データを失いました)、データベースに正しいステートメントを手動で入力してその列のみを追加しました。
次に、移行を実装するsouth
というプロジェクトが登場しました。これは、データベースへの変更を順方向に(および逆方向に、元に戻す)移行し、データの整合性を保持する方法があることを意味していました。
Django 1.7では、south
の機能はDjangoに直接統合されました。移行を使用する場合、プロセスは少し異なります。
models.py
_を変更します(通常どおり)。makemigrations
コマンドで実行されます。このコマンドは、何が変更されたかを検出するのに十分スマートであり、データベースへの変更を有効にするスクリプトを作成します。migrate
を使用してその移行を適用します。このコマンドは、すべての移行を順番に適用します。したがって、通常のsyncdb
は、2段階のプロセス、_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)
_
このモデルには、必須の2つのフィールドhighlighted
とcode
があります(nullにすることはできません)。
これらのフィールドを最初から追加した場合、テーブルに既存の行がないため問題はありませんか?
ただし、テーブルがすでに作成されており、nullにできないフィールドを追加する場合は、既存の行に提供するデフォルト値を定義する必要があります。そうしないと、データベースはデータ整合性制約に違反するため変更を受け入れません。
これがコマンドのプロンプトです。 Django=に移行中にデフォルトを適用するように指示するか、モデル自体に「空の」デフォルトhighlighted = models.TextField(default='')
を指定できます。
エラーに焦点を当てましょう:
例外値:そのような列はありません:snippets_snippet.owner_id
それが本当かどうか見てみましょう...
Manage.pyコマンドを使用して dbシェルにアクセス (これはsettings.py変数を使用するので、必ず正しいものに接続してください)。
manage.py dbshell
次のように入力して、テーブルの詳細を表示できます。
.schema TABLE_NAME
またはあなたの場合:
.schema snippets_snippet
より多くのsqliteコマンドを見つけることができます here または以下を発行することにより:
。助けて
最後に、次のように入力してセッションを終了します。
。終了する
これは森から抜け出すことはできませんが、問題のどの端に取り組むべきかを知るのに役立ちます:)
幸運を!
ここでも同じ問題があり、同じエラーが発生しています。同じエラーを経験する将来のユーザーのためにこれを書きたいです。 @Burhan Khalidが言ったようにクラススニペットモデルに変更を加えた後、テーブルを移行する必要があります。
python manage.py makemigrations snippets
python manage.py migrate
これでエラーが解決するはずです。楽しい。
このエラーは、views.pyなどで、そのテーブルに依存するクラスをインスタンス化した場合に発生する可能性があります。
このタイプの問題を解決する最も直接的な方法は、次の3つのステッププロセスです。
アプリの移行フォルダ/ディレクトリからすべての移行関連ファイルを削除します(これらは基本的に0000、0001、0002などで始まります)。
db.sqliteという名前の既存のデータベースファイルをAppディレクトリから削除/名前変更します。
次のコマンドを実行します。
python manage.py migrate
最後に実行
python manage.py createsuperuser
管理タスクを実行します(必要な場合)。
Burhan Khalidの回答と移行に関するコメントから得たものです。私にとっては、「移行」フォルダーの内容をデータベースとともに削除してから、manage.py migrateを実行しました。移行フォルダーにテーブル構造に関する情報が保存されているため、データベースを削除するだけでは不十分です。
ステップ1:db.sqlite3ファイルを削除します。
ステップ2:$ python manage.py migrate
ステップ3:$ python manage.py makemigrations
ステップ4:$ python manage.py createsuperuserを使用してスーパーユーザーを作成する
新しいdb.sqlite3は自動的に生成されます
移行フォルダー内にpycacheフォルダーが隠されていることを覚えておいてください。モデルを変更してすべての移行ファイルを削除する場合は、pycacheフォルダーも削除する必要があります。
削除すべきでないのは、initファイルのみです。
お役に立てれば
あなたはすべて正しいことをした、私は同じ問題を経験した。最初にデータベースと移行を削除しますmakemigrations
でアプリの追加名を解決しました:
python manage.py makemigrations appname
python manage.py migrate
これは間違いなく機能します。
リシケシに同意する。私もこの問題を長い間解決しようとしました。これは、2つの方法のいずれかまたは両方で解決されます。
1.アプリの移行フォルダー内の移行を削除してみて(init。pyを除く)、makemigrationsコマンドを実行します
2.それがうまくいかない場合は、モデルの名前を変更してみてください(これが最後の手段であり、少し厄介になるかもしれませんが、確かに動作します。IfDjango Nを押してください。」)。
私はこの問題に直面し、これが私がそれを解決した方法です。
1)アプリの移行ディレクトリからすべての移行レコードを削除します。これらは0001_、0002_、0003_などの名前のファイルです。_init__。pyファイルを削除しないように注意してください。
2)db.sqlite3ファイルを削除します。後で再生成されます。
ここで、次のコマンドを実行します。
python manage.py makemigrations appname
python manage.py migrate
移行後にアプリの名前を必ず書いてください。データベースに再度アクセスするには、スーパーユーザーを作成する必要があります。次のようにしてください
python manage.py createsuperuser
私も同じ問題に直面しています。
新しいフィールドを追加する場合、列が見つからないというエラーが表示されます。
次に、make migration
コマンドとその後のmigrate
コマンドその後も同じエラー.. EX ...
path=models.FilePathField()
フィールドのデフォルト値を追加
path=models.FilePathField(default='')
適用コマンドより
python manage.py makemigrations
python manage.py migrate
あなたを助けるかもしれません
あなたの問題が私のものの場合、これは回避策です。良いニュースは、データベースを削除する必要がないことです。
このモデルを参照として使用する他のモデルがないことを確認してください。
Django.db.utils.OperationalError: no such column: parts_part_type.blah
これは、この製品を参照する「製品」と呼ばれる別のアプリに「製品」と呼ばれる別のモデルがあったために、私にのみ起こりました。
part = models.ForeignKey("parts.Part", related_name="some part", limit_choices_to={'part_type':Part_Type.objects.get(prefix='PART')},)
私の解決策は:
python manage.py makemigrations; python manage.py migrate
python manage.py makemigrations; python manage.py migrate
技術的には、limit_choices_to
参照
最初に、これらのエラーを引き起こしている新しいフィールドをコメントし、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とboomを実行します。それは私のために働いた。 :)