2016-06-23 14 views
7

Ho appena creato un proxy model ed è stato sorpreso dal fatto che manage.py makemigrations crea un nuovo file di migrazione con un'operazione migrations.CreateModel.Perché Django crea file di migrazione per modelli proxy?

Un modello proxy non crea una nuova tabella di database, è solo un'interfaccia python diversa per lo stesso set di dati e in effetti manage.py sqlmigrate my_app_label 0042 non restituisce nulla.

Ho pensato che potrebbe essere utilizzato per creare il modello proxy ContentType ma quelli sono creati su richiesta se non esistono.

Viene utilizzato per attivare la creazione delle autorizzazioni del modello proxy? C'è un 6 year old open bug sui permessi del modello proxy quindi non sono proprio sicuro di come dovrebbe funzionare questa parte ora ...

Per verificare ciò è stato utilizzato Django 1.8.

Edit: per chiarire, Django crea una migrazione che non fa nulla per i nuovi modelli di proxy quindi non vorremmo Django di non creare la migrazione, in primo luogo, se è di alcuna utilità?

Esiste un caso d'uso in cui sarebbe utile avere la migrazione?

risposta

9

Ah ma se apri la migrazione nel tuo editor, scoprirai che è in realtà una migrazione vuota! Ecco un esempio

class Migration(migrations.Migration): 
    dependencies = [ 
     ('stackoverflow', '0009_auto_20160622_1507'), 
    ] 

    operations = [ 
     migrations.CreateModel(
      name='MyArticle', 
      fields=[ 
      ], 
      options={ 
       'proxy': True, 
      }, 
      bases=('stackoverflow.article',), 
     ), 
    ] 

E se lo fai ./manage.py sqlmigrate myapp 0010 (che è il numero che corrisponde alla mia migrazione sopra) quello che ottengo è ciò che è nella riga successiva (niente)

Questo perché la sezione fields della migrazione è e proxy = True. Ciò impedisce l'esecuzione di qualsiasi SQL per questa migrazione e la tabella originale non viene modificata.

Quindi potresti chiederti perché il django si preoccupa di creare una migrazione vuota? Questo perché il modello proxy può essere indirizzato da un altro modello in una futura migrazione.