Question

I am trying to add add some data to the database as soon as tables are created, using the post_syncdb signal.

signals.post_syncdb.connect(init)

Then in the init function, I want to set permission, so I use

ct = ContentType.objects.get(app_label='news', model='Article')
Permission(name='Approve articles', codename='can_approve_article', content_type=ct)

But if I drop all the tables and run syncdb, I get

...
File "...\base\functions\init.py", line 11, in init
  ct = ContentType.objects.get(app_label='news', model='Article')
...
django.contrib.contenttypes.models.DoesNotExist: ContentType matching query does not exist.

Some tests I have done:

  • It works fine if I try this code outside syncdb.
  • It also works fine if I let syncdb create all the tables without this code, and then add this code and run syncdb without it having to make any changes.
  • AND I am pretty sure it used to work, but I changed a lot of things in other places since then, so I don't know where to start.
  • I get the same error for other models in different apps.
  • The signal is fired about 10 times, only the first few times throw the error.

Thanks a lot for any hints!

Was it helpful?

Solution

Add this to the beginning of your init function:

 from django.contrib.contenttypes.management import update_all_contenttypes
 update_all_contenttypes() # make sure all content types exist
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top