Question

J'essaie d'ajouter des données à la base de données dès que les tables sont créées, en utilisant le post_syncdb signal.

signals.post_syncdb.connect(init)

Ensuite, dans la fonction init, je souhaite définir l'autorisation, j'utilise donc

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

Mais si je laisse tomber toutes les tables et que je cours syncdb, Je reçois

...
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.

Quelques tests que j'ai fait :

  • Cela fonctionne bien si j'essaye ce code à l'extérieur syncdb.
  • Cela fonctionne aussi bien si je laisse syncdb créez toutes les tables sans ce code, puis ajoutez ce code et exécutez syncdb sans avoir à apporter de modifications.
  • ET je suis presque sûr que cela fonctionnait, mais j'ai changé beaucoup de choses ailleurs depuis, donc je ne sais pas par où commencer.
  • J'obtiens la même erreur pour d'autres modèles dans différentes applications.
  • Le signal est déclenché environ 10 fois, seules les premières fois génèrent l'erreur.

Merci beaucoup pour tous les conseils !

Était-ce utile?

La solution

Ajoutez ceci au début de votre fonction init :

 from django.contrib.contenttypes.management import update_all_contenttypes
 update_all_contenttypes() # make sure all content types exist
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top