2009-08-17 6 views
22

Sto lavorando a Django e mi piace davvero tanto, ma ho un problema e non sono sicuro di quale sia il modo tipico per risolverlo.Pattern MVC Django per modelli non basati su database?

Supponiamo che ho una visione che dovrebbe essere aggiornato quando un oggetto Python complesso è aggiornato, ma questo oggetto non è guidato dal database, dire che è guidato da chiamate AJAX o direttamente dall'utente o qualcosa del genere.

Dove si trova questo codice? Dovrebbe ancora andare in models.py ????

risposta

36

Il tuo models.py può essere (e talvolta è) vuoto. Non sei obbligato ad avere un modello che mappa su un database.

Si dovrebbe ancora avere un file models.py, per rendere felice l'amministratore di Django. Il nome del file models.py è importante ed è più semplice avere un file vuoto che provare a modificare il file previsto dai vari comandi di amministrazione.

Il "modello" - in generale - non deve mappare su un database. Il "modello" - come componente generale del design MVC - può essere qualsiasi cosa.

È possibile, e spesso è possibile, definire il proprio modulo "modello" utilizzato dalle visualizzazioni. Basta non chiamarlo models.py perché confonderà l'amministratore di Django. Chiamalo qualcosa di significativo per la tua applicazione: foo.py. Questo foo.py manipola le cose reali che sono alla base della tua applicazione, non necessariamente una sottoclasse di Django Model.model.

Django MVC non richiede una mappatura del database. Si prevede esplicitamente che il modulo denominato models.py abbia un mapping di database al suo interno. Quindi, utilizzare uno models.py vuoto se non si ha un vero mapping del database.

tuo views.py possono utilizzare

import foo 

def index(request): 
    objects = foo.somelistofobjects() 
    *etc.* 

Django consente di lavorare facilmente senza la mappatura di database. Il tuo modello può facilmente essere qualsiasi cosa. Basta non chiamarlo models.py.


Modifica.

Le viste sono registrate con Modelli? No.

In caso di aggiornamento del modello da parte del controller, le viste vengono notificate? No.

Il modello è strettamente rappresentativo dei dati poiché questo è in realtà MVP? Sì.

Leggi i documenti di Django. È semplice.

Richiesta Web -> Mappatura URL -> Visualizza funzione -> Modello -> Risposta.

Il modello può essere utilizzato dalla funzione di visualizzazione. Il modello può essere una mappatura del database o può essere qualsiasi altra cosa.

+0

La tua risposta può essere corretta o non corretta, non ho usato Django, e sono passati 2 anni da quando ho usato Python. Ma questo è ciò che odio di ciò che i framework web hanno fatto al concetto di MVC.Non vi è alcuna richiesta di ferro che i dati del modello nel paradigma MVC provengano dal database. –

+0

Il modello * non * deve provenire da un database. Lo facciamo nelle nostre applicazioni Django. Alcune delle nostre app hanno modelli che non sono nel database. –

+3

Abbastanza onesto ma a quanto pare devi lavorare in un modo che non è standard in Django per farlo. E ovviamente l'ho visto anche con altri framework. Penso che abbiano tutti fatto un disservizio agli sviluppatori web impressionabili e con meno esperienza introducendo la nozione di "classi modello". Il più delle volte queste sono in realtà * classi * entità *. Non sono nemmeno d'accordo che ci dovrebbe essere qualcosa come una classe modello, il modello è ad un livello ancora più alto di astrazione. Forse una facciata modello, ma classi modello, no. Ad ogni modo, è il mio animaletto e suppongo di essere un purista di MVC o qualcosa del genere. –