新手在这里。 尝试使用Django和Postgres db构建应用程序。我正在努力迁移此刻收到此错误“KeyError:('profiles','talk')”
尝试迁移后,我的命令行出现以下错误:
(myvenv) Abbys-iMac:talks abbyhumphreys$ python manage.py migrate
/Users/abbyhumphreys/talks/myvenv/lib/python3.4/site-packages/django/contrib/sites/models.py:78: RemovedInDjango19Warning: Model class django.contrib.sites.models.Site doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
class Site(models.Model):
System check identified some issues:
WARNINGS:
profiles.Profile.user: (fields.W342) Setting unique=True on a ForeignKey has the same effect as using a OneToOneField.
HINT: ForeignKey(unique=True) is usually better served by a OneToOneField.
registration.RegistrationProfile.user: (fields.W342) Setting unique=True on a ForeignKey has the same effect as using a OneToOneField.
HINT: ForeignKey(unique=True) is usually better served by a OneToOneField.
Operations to perform:
Synchronize unmigrated apps: staticfiles, registration, humanize, messages
Apply all migrations: profiles, auth, sessions, admin, contenttypes
Synchronizing apps without migrations:
Creating tables...
Running deferred SQL...
Installing custom SQL...
Running migrations:
Rendering model states...Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/Users/abbyhumphreys/talks/myvenv/lib/python3.4/site-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
utility.execute()
File "/Users/abbyhumphreys/talks/myvenv/lib/python3.4/site-packages/django/core/management/__init__.py", line 330, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Users/abbyhumphreys/talks/myvenv/lib/python3.4/site-packages/django/core/management/base.py", line 390, in run_from_argv
self.execute(*args, **cmd_options)
File "/Users/abbyhumphreys/talks/myvenv/lib/python3.4/site-packages/django/core/management/base.py", line 441, in execute
output = self.handle(*args, **options)
File "/Users/abbyhumphreys/talks/myvenv/lib/python3.4/site-packages/django/core/management/commands/migrate.py", line 221, in handle
executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
File "/Users/abbyhumphreys/talks/myvenv/lib/python3.4/site-packages/django/db/migrations/executor.py", line 104, in migrate
state = migration.mutate_state(state, preserve=do_run)
File "/Users/abbyhumphreys/talks/myvenv/lib/python3.4/site-packages/django/db/migrations/migration.py", line 83, in mutate_state
operation.state_forwards(self.app_label, new_state)
File "/Users/abbyhumphreys/talks/myvenv/lib/python3.4/site-packages/django/db/migrations/operations/fields.py", line 256, in state_forwards
for n, f in state.models[app_label, self.model_name_lower].fields
KeyError: ('profiles', 'talk')
这是我的models.py:
from django.contrib.auth.models import User
from django.db import models
class Profile(models.Model):
name = models.CharField(max_length=255)
sname = models.CharField(max_length=255, blank=True, null=True)
phone = models.CharField(max_length=255, blank=True, null=True)
mobile = models.CharField(max_length=255, blank=True, null=True)
email = models.EmailField(max_length=254, blank=True, null=True)
address = models.TextField(blank=True, null=True)
notes = models.TextField()
slug = models.SlugField(unique=True)
user = models.ForeignKey(User, unique=True, blank=True, null=True, related_name="users")
class Talk(models.Model):
talk_no = models.CharField(max_length=255, blank=True, null=True)
talk_name = models.CharField(max_length=255, blank=True, null=True)
slug = models.SlugField(unique=True)
class Congregation(models.Model):
cong_name = models.CharField(max_length=255, blank=True, null=True)
meeting_time = models.CharField(max_length=255, blank=True, null=True)
cong_address = models.TextField(blank=True, null=True)
cong_phone = models.CharField(max_length=255, blank=True, null=True)
slug = models.SlugField(unique=True)
这是我的views.py:
from django.contrib.auth.decorators import login_required
from django.http import Http404
from django.shortcuts import render, render_to_response, redirect
from django.template import RequestContext
from profiles.forms import ProfileForm, TalkForm, CongForm
from profiles.models import Profile, Talk, Congregation
from django.template.defaultfilters import slugify
def index(request):
ids = Profile.objects.all()
return render(request, 'index.html',{'ids': ids,})
def about(request):
return render(request, 'about.html',)
def contact(request):
return render(request, 'contact.html',)
def profile_detail(request, slug):
#grab the object...
profile=Profile.objects.get(slug=slug)
#and pass to the template
return render(request,'ids/profile_detail.html', {
'profile': profile,
})
@login_required
def edit_profile(request, slug):
profile = Profile.objects.get(slug=slug)
if profile.user != request.user:
raise Http404
form_class = ProfileForm
if request.method == 'POST':
form = form_class(data=request.POST, instance=profile)
if form.is_valid():
form.save()
return redirect('profile_detail', slug=profile.slug)
else:
form = form_class(instance=profile)
return render(request, 'ids/edit_profile.html', {'profile': profile, 'form': form, })
def create_profile(request):
form_class = ProfileForm
if request.method == 'POST':
form=form_class(request.POST)
if form.is_valid():
profile=form.save(commit=False)
profile.user = request.user
profile.slug = slugify(profile.name)
profile.save()
slug = slugify(name)
return redirect('profile_detail', slug=profile.slug)
else:
form=form_class()
return render(request, 'ids/create_profile.html', {'form': form,})
def browse_by_name(request, initial=None):
if initial:
ids = Profile.objects.filter(name__istartswith=initial).order_by('name')
else:
ids = Profile.objects.all().order_by('name')
return render_to_response('search/search.html', {'ids': ids, 'initial': initial,}, context_instance=RequestContext(request))
def talk_detail(request, slug):
#grab the object...
talk=Talk.objects.get(slug=slug)
#and pass to the template
return render(request,'ids/talk_detail.html', {
'talk': talk,
})
@login_required
def edit_talk(request, slug):
talk = Talk.objects.get(slug=slug)
if profile.user != request.user:
raise Http404
form_class = TalkForm
if request.method == 'POST':
form = form_class(data=request.POST, instance=talk)
if form.is_valid():
form.save()
return redirect('talk_detail', slug=slug.slug)
else:
form = form_class(instance=talk)
return render(request, 'ids/edit_talk.html', {'talk': talk, 'form': form, })
def create_talk(request):
form_class = TalkForm
if request.method == 'POST':
form=form_class(request.POST)
if form.is_valid():
talk=form.save(commit=False)
profile.user = request.user
talk.slug = slugify(talk.talk_no)
talk.save()
slug = slugify(talk_no)
return redirect('talk_detail', slug=talk.slug)
else:
form=form_class()
return render(request, 'ids/create_talk.html', {'form': form,})
def cong_detail(request, slug):
#grab the object...
cong=Congregation.objects.get(slug=slug)
#and pass to the template
return render(request,'ids/cong_detail.html', {
'cong': cong,
})
@login_required
def edit_cong(request, slug):
cong = Congregation.objects.get(slug=slug)
if profile.user != request.user:
raise Http404
form_class = CongForm
if request.method == 'POST':
form = form_class(data=request.POST, instance=cong)
if form.is_valid():
form.save()
return redirect('cong_detail', slug=cong.slug)
else:
form = form_class(instance=cong)
return render(request, 'ids/edit_cong.html', {'cong': cong, 'form': form, })
def create_cong(request):
form_class = CongForm
if request.method == 'POST':
form=form_class(request.POST)
if form.is_valid():
cong=form.save(commit=False)
profile.user = request.user
cong.slug = slugify(cong.cong_name)
cong.save()
slug = slugify(cong_name)
return redirect('cong_detail', slug=cong.slug)
else:
form=form_class()
return render(request, 'ids/create_cong.html', {'form': form,})
这是我的url.py
from django.contrib import admin
from profiles.backends import MyRegistrationView
from django.conf.urls import patterns, include, url
from django.contrib import admin
from django.views.generic import TemplateView, RedirectView
from django.contrib.auth.views import password_reset, password_reset_done, password_reset_confirm, password_reset_complete
urlpatterns = patterns('',
url(r'^$', 'profiles.views.index', name='home'),
url(r'^about/$', TemplateView.as_view(template_name='about.html'), name='about'),
url(r'^contact/$', TemplateView.as_view(template_name='contact.html'), name='contact'),
url(r'^ids/$', RedirectView.as_view(pattern_name='browse')),
url(r'^ids/(?P<slug>[-\w]+)/$', 'profiles.views.profile_detail', name='profile_detail'),
url(r'^ids/(?P<slug>[-\w]+)/edit/$', 'profiles.views.edit_profile', name='edit_profile'),
url(r'^ids/(?P<slug>[-\w]+)/$', 'profiles.views.talk_detail', name='talk_detail'),
url(r'^ids/(?P<slug>[-\w]+)/edit/$', 'profiles.views.edit_talk', name='edit_talk'),
url(r'^ids/(?P<slug>[-\w]+)/$', 'profiles.views.cong_detail', name='cong_detail'),
url(r'^ids/(?P<slug>[-\w]+)/edit/$', 'profiles.views.edit_cong', name='edit_cong'),
url(r'^browse/$', RedirectView.as_view(pattern_name='browse')),
url(r'^browse/name/$','profiles.views.browse_by_name', name='browse'),
url(r'^browse/name/(?P<initial>[-\w]+)/$', 'profiles.views.browse_by_name', name='browse_by_name'),
url(r'^accounts/password/reset/$', password_reset,
{'template_name': 'registration/password_reset_form.html'},
name="password_reset"),
url(r'^accounts/password/reset/done/$',
password_reset_done,
{'template_name': 'registration/password_reset_done.html'},
name="password_reset_done"),
url(r'^accounts/password/reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$',
password_reset_confirm,
{'template_name': 'registration/password_reset_confirm.html'},
name="password_reset_confirm"),
url(r'^accounts/password/done/$', password_reset_complete,
{'template_name': 'registration/password_reset_complete.html'},
name="password_reset_complete"),
url(r'^accounts/register/$', MyRegistrationView.as_view(), name='registration_register'),
url(r'^accounts/create_profile/$', 'profiles.views.create_profile', name='registration_create_profile'),
url(r'^accounts/create_talk/$', 'profiles.views.create_talk', name='registration_create_talk'),
url(r'^accounts/create_cong/$', 'profiles.views.create_cong', name='registration_create_cong'),
url(r'^accounts/', include('registration.backends.default.urls')),
url(r'^admin/', include(admin.site.urls)),
)
不确定我是否提供了太多或太少的信息,但作为新手,我不知道错误意味着什么,或者您可能需要了解哪些信息!
提前感谢您在解决此问题方面提供的帮助,以及您耐心查看我所有糟糕的代码! :-s
答案 0 :(得分:1)
执行以下步骤时会发生这种情况:
迁移appname
并且由于错误而停止执行。
你再次运行它,但这次是一个错误因为新表 已经创建。
您编辑迁移文件,删除代码 创建表的部分,然后再次运行迁移。
我的解决方法是,我移动了,而不是删除CreateModel 它到上一个迁移文件。
答案 1 :(得分:1)
最好在此问题中显示迁移文件的代码,因为可能存在问题。
您可能没有创建名称为talk
的模型的迁移文件。
可以通过在其中一个迁移文件中添加talk
模型创建来解决问题。
答案 2 :(得分:0)
当我编辑迁移文件但是在创建该字段的模型之前没有注意到我为一个字段放置了一个AddField()
时,这个错误就出现了。也许可以帮助别人。
答案 3 :(得分:0)
我已经建立了自己的&#34;轮式包装&#34; (您可以使用pip install <filename>
安装的内容)以及部署它并运行./manage.py migrate
之后,遇到了这个问题。
这就是我发现问题的原因:
在我的开发箱上,我删除了所有迁移,运行makemigrations
并构建了一个新包。在将新软件包部署到测试框并删除数据库以从头开始之后,migrate
仍会尝试应用它不应该知道的旧迁移文件。
我发现构建过程以某种方式没有清除迁移文件夹(在我的情况下为/<app>/build/lib/<app>/migrations/
),该文件夹包含较早的迁移文件,这些文件来自早先的混乱模型。所以有0001*
等多个版本,Django试图将它们全部应用。
我删除了/build
- 目录,让脚本从头创建它。
答案 4 :(得分:0)
这里的新手也遇到了同样的问题,尽管我很欣赏线程早已变冷。我遵循了最新的Django 2.1教程,然后尝试将我的应用迁移到单独的“ Django-app”软件包中。
我一直让KeyError起源于state.models [app_label,self.model_name_lower] .fields
@Chris的上述建议非常有帮助。我使用的是Mac OS High Sierra,因此我转到〜/ .virtualenvs / env / lib / python3.7 / site-packages,并删除了自原始安装以来创建的所有内容,包括我之前安装的应用程序版本将其打包为Django应用。
它仍然不起作用,所以我发现还需要再执行一步。我在〜/ Library / Caches / pip / wheels中发现了所有被删除的垃圾。我还从mySQL数据库中删除了Django db。
然后我创建了一个新的Django超级用户;重新制作迁移并运行它们。
现在效果很好。
希望这可以帮助另一个像我这样沮丧的菜鸟。
答案 5 :(得分:0)
发生关键错误的原因是,迁移计划未加载您正在修改的模型的模型状态。 为了使计划加载该模型,它需要在迁移树中的某处找到一个CreateModel指令(通过迁移树,我指的是遍历迁移的“依赖项”部分时构建的树)。
如果该树永远不会导致使用模型的CreateModel语句进行迁移,则它将不在计划中。
添加一个指向包含CreateModel指令的依赖项,以进行相关迁移,一切应该可以正常进行。
答案 6 :(得分:0)
当我的迁移之一未成功执行时,我收到了此错误。
要重现该问题,请在django应用程序中执行以下操作:
./manage.py showmigrations
检查是否已应用所有迁移。