La query di corrispondenza ContentType non esiste su post_syncdb
-
12-12-2019 - |
Domanda
Sto cercando di aggiungere alcuni dati al database non appena vengono create le tabelle, utilizzando il file post_syncdb
segnale.
signals.post_syncdb.connect(init)
Quindi nella funzione init, voglio impostare l'autorizzazione, quindi utilizzo
ct = ContentType.objects.get(app_label='news', model='Article')
Permission(name='Approve articles', codename='can_approve_article', content_type=ct)
Ma se lascio cadere tutti i tavoli e scappo syncdb
, Ottengo
...
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.
Alcuni test che ho fatto:
- Funziona bene se provo questo codice all'esterno
syncdb
. - Funziona bene anche se lo lascio fare
syncdb
crea tutte le tabelle senza questo codice, quindi aggiungi questo codice ed esegui syncdb senza dover apportare alcuna modifica. - E sono abbastanza sicuro che funzionasse, ma da allora ho cambiato molte cose in altri posti, quindi non so da dove cominciare.
- Ottengo lo stesso errore per altri modelli in app diverse.
- Il segnale viene attivato circa 10 volte, solo le prime volte generano l'errore.
Grazie mille per eventuali suggerimenti!
Soluzione
Aggiungi questo all'inizio della tua funzione init:
from django.contrib.contenttypes.management import update_all_contenttypes
update_all_contenttypes() # make sure all content types exist
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow