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!

È stato utile?

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
scroll top