2009-05-13 13 views
37

Ho iniziato a lavorare su una app locale che viene eseguita attraverso il browser. Avendo recentemente svolto il tutorial di django, penso che potrebbe essere meglio usare django piuttosto che un semplice pitone.Circa 20 modelli in 1 app django

C'è un problema: ho almeno 20 modelli e ognuno avrà molte funzioni. Molto semplicemente creerà un enorme file di modelli e probabilmente anche enormi viste. Come li divido?

quindi non posso semplicemente trasformarli in app separate, posso?

risposta

30

"Ho almeno 20 modelli" - questo è probabilmente più di un Django "app" ed è più simile a un "progetto" Django con diversi "apps" piccoli

mi piace di partizionare le cose intorno a temi o aree tematiche che hanno alcuni (da 1 a 5) modelli. Questa diventa un'app "Django" - ed è l'utile unità di riusabilità.

Il "progetto" generale è una raccolta di app che presenta la cosa integrata costituita da pezzi separati.

Ciò aiuta anche la gestione del progetto poiché ogni "app" può diventare uno sprint con un rilascio alla fine.

+1

Ma se i modelli devono essere in relazione tra loro, come posso inserirli in app separate? – Teifion

+2

Un modello può facilmente fare riferimento a modelli in un altro pacchetto. Hai quasi sempre modelli "di livello superiore" e "di livello inferiore". Implementa i modelli di livello inferiore in un'unica app. Le app di livello superiore possono dipendere dai modelli di app di livello inferiore. –

+13

Ogni volta che si imposta una chiave esterna per il modello Utente in django.contrib.auth, ci si relaziona su app separate ... –

0

È possibile suddividere i modelli su più file. Questo vale anche per le visualizzazioni.

0

È possibile dividere in file separati e semplicemente avere importazioni nella parte superiore del tuo campo model.py principale.

Se vuoi davvero che lo desideri sia un'altra domanda.

+0

Come ha detto Jarret Hardie, la creazione di un pacchetto python (ovvero una directory con un file __init__.py) chiamato modelli sarebbe il modo migliore per farlo. –

69

Questa è una necessità abbastanza comune ... Non riesco a immaginare guadare un file models.py che è di 10.000 linee :-) lungo

È possibile dividere il file models.py (e views.py troppo) in un pacakge. In questo caso, il vostro albero del progetto sarà simile:

/my_proj 
    /myapp 
     /models 
      __init__.py 
      person.py 

Il file __init__.py rende la cartella in un pacchetto. L'unica Gotcha è quello di essere sicuri di definire una interna Meta classe per i vostri modelli che indicano l'app_label per il modello, altrimenti Django avrà problemi a costruire il vostro schema:

class Person(models.Model): 
    name = models.CharField(max_length=128) 

    class Meta: 
     app_label = 'myapp' 

Una volta fatto, importare il modello in vostro __init__.py file in modo che Django e db sincronizzazione lo troveranno:

from person import Person 

In questo modo si può ancora fare from myapp.models import Person

+0

È teoricamente funzionante, ma l'esecuzione della linea dal tutorial "python manage.py sql gui" non fa nulla, non ha idea di cosa succede? – Teifion

+1

Questo di solito significa che Django non riesce a trovare i modelli. Assicurati di aver importato le importazioni nel tuo file models.__init__.py e di aver impostato l'etichetta_app per ciascun modello. Assicurati inoltre di aver eliminato il vecchio file models.py. –

+11

Questo è tecnicamente corretto, ma alquanto più basso vale la pena visto che è una cattiva idea nella pratica. Se hai abbastanza modelli per pensare a suddividere il tuo models.py, dovresti suddividerlo in più app. –

16

I modelli sono tutti correlati quindi non posso semplicemente trasformarli in app separate posso?

È possibile separarli in app separate. Per utilizzare un modello in un'app da un'altra app, è sufficiente importarlo nello stesso modo in cui si importano le app django.contrib.

+14

+1. Non c'è nessuna legge contro le app che dipendono l'una dall'altra. – muhuk

5

Avere 20 modelli in un'app potrebbe essere un segno che dovresti suddividerlo in quelli più piccoli.

Lo scopo di un'app Django è di avere un piccolo pezzo di codice monouso, che si adatti perfettamente.

Quindi, se disponi di un sito di e-commerce, potresti avere un'app shopping_cart, un'app di fatturazione e così via.

Ricorda che nelle app non c'è alcun problema tra loro (anche se è sempre meglio se possono essere disaccoppiati), ma non dovresti avere un'app che fa due cose ben distinte.

L'articolo Django tips: laying out an application potrebbe essere utile. Come sempre, prendi tutto ciò che leggi con un pizzico di sale (compresa questa risposta).