Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

KeyError: ('profiles', 'talk') - How do I resolve?

Newbie here. Trying to build an app using Django and Postgres db. I am struggling to migrate at the moment getting this error "KeyError: ('profiles', 'talk')"

Here is my error from my command line after trying to migrate:

(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')

Here is my 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)

Here is my 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,})

Here is my 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)),
)

Not sure if I've given too much or too little info, but being a newbie, I have no idea what the error means or what information you might need to figure it out!

Thank you in advance for your help in resolving this problem and your patience in looking at all my awful code! :-s

like image 935
bibby3316 Avatar asked May 14 '15 16:05

bibby3316


3 Answers

This happens when you do the following steps:

  1. Run

migrate appname

and execution stopped because of an error.

  1. You run it again, but this time its an error because the new table is already created.

  2. You edit the migration file, remove the code part creating the table, then run the migration again.

My workaround is, instead of removing CreateModel, I moved it to the previous migration file.

like image 100
Noel Pure Avatar answered Nov 03 '22 00:11

Noel Pure


You better to show the code of your migration files in this issue because the problem probably is there.

It might be that you didn't have a migration file where you created your model with name talk.

Problem could be solved with adding creation of talk model into one of the migration files.

like image 1
Roberto Avatar answered Nov 03 '22 02:11

Roberto


I had built my own "wheel-package" (the things that you can install with pip install <filename>) and after deploying it and going ./manage.py migrate, ran into this problem.

This is how I found out what the problem was:

On my dev-box, I deleted all migrations, ran makemigrations and built a new package. After deploying the new package to the test-box and deleting the database to start from scratch, migrate would still try to apply old migration-files it should not have known about.

I found that the build-process somehow did not clean the migrations-folder (in my case at /<app>/build/lib/<app>/migrations/) which held older migration-files from earlier attempts to mess with the model. So there were multiple versions of 0001* etc and Django tried to apply them all.

I deleted the /build-directory and let the script create it from scratch.

like image 1
Chris Avatar answered Nov 03 '22 00:11

Chris