2012-12-24 12 views
8

Ho aggiunto un campo molti-a-molti a un modello esistente e mi aspettavo che syncdb crei una nuova tabella, ma non c'è niente lì. Questo è ciò che il modello si presenta come:Django - syncdb non crea tabelle

class Author(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 
    email = models.EmailField() 

    def __unicode__(self): 
     return "{0} {1}".format(self.first_name, self.last_name) 

class Book(models.Model): 
    title = models.CharField(max_length=100) 
    authors = models.ManyToManyField(Author) 

    def __unicode__(self): 
     return self.title 

Esecuzione sql myapp stampe le affermazioni corrette con la nuova tabella, ma questo non si riflette quando corro syncdb. validate non restituisce alcun errore. Qualcuno sa che cosa potrebbe essere il problema qui? O una diagnosi migliore?

risposta

15

Il comando syncdb non crea molte tabelle per modelli esistenti in base alla progettazione. Questa decisione è spiegata allo ticket 2229.

Questo lascia alcune opzioni.

  • Se non si dispone di dati nel modello Book, rilasciare la tabella e rieseguire syncdb. Django ricrea il tavolo del libro e il tavolo da molti a molti.
  • Utilizzare il comando dbshell e creare la tabella di unione da molti a molti utilizzando l'output di sql myapp.
  • Se si eseguono più migrazioni di schemi con Django, fare amicizia con South.
5

Ho trovato questa spiegazione al django docs utile: SchemaEvolution.

Lo standard di fatto per la migrazione del database è Django South.

Non è perfetto, ma funziona piuttosto bene. Dovresti sempre controllare (e modificare se necessario) il tuo file di migrazione prima di eseguirlo, per assicurarti che faccia effettivamente quello che dovrebbe fare. Puoi dare un'occhiata al loro tutorial here.

Inoltre, se si esegue:

python manage.py inspectdb > somefile.txt 

È possibile ottenere rapidamente verificare se la struttura del database è corrispondente ai vostri modelli Django.

Problemi correlati