La requête de correspondance ContentType n'existe pas sur post_syncdb
-
12-12-2019 - |
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 !
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