Ho bisogno di aiuto per migliorare l'architettura di un sito che ho costruito. Quello che voglio ottenere all'interno di un singolo progetto Django è il seguente:
- Voglio un sito che è disponibile in diverse versioni (una all'anno), in modo che ogni versione abbia un insieme di app correlate a quella versione.
-
Voglio mantenere tutte le vecchie versioni del sito e lo stato delle app in quella versione, ma posso ancora aggiungere / modificare / rimuovere le app per qualsiasi altra versione. Cioè, le app potrebbero essere diverse tra le varie versioni (modelli, metodi, admin, modelli, praticamente qualsiasi cosa).
-
Voglio che ogni app che appartiene a una versione abbia solo i dati per quella versione. App1 sulla versione 2012 dovrebbe avere una tabella di database e App1 sulla versione 2013 ne dovrebbe avere un'altra, anche se sono uguali.
Potrebbe essere qualcosa del genere:
site.com/2012
App1_v1
App2_v1
site.com/2013
App1_v1
App2_v2 (maybe added some fields or methods, changed templates)
site.com/2014
App1_v2
App2_v2
App3_v1
La mia attuale soluzione è piuttosto orribile. Quando viene lanciata una nuova versione del sito, faccio semplicemente copia-incolla un'app precedente e faccio in modo che la vecchia app sia così com'è e quindi aggiungendo / modificando la nuova versione dell'app. Ma, quando aggiungo altre app e altre versioni, ottengo una quantità stupida di app e mi sembra un cattivo design.
Come posso ottenere questo a Django in un modo migliore? O almeno, come posso progettarlo / strutturarlo in un modo migliore? Penso ad avere un modello base per ogni app, da cui ogni versione eredita, ma che comunque fa molte app.
Come esempio di un'app che ho, potrebbe assomigliare a questo:
Nome app: App_v1_2012
Modello
class Bag(models.Model)
name = models.CharField()
class Item(models.Model)
name = models.CharField()
in_bag = models.ForeignKey(Bag)
Visualizza
class IndexView(generic.ListView):
model = Bag
template_name = 'sometemplate_2012.html'
Nome app: App_v1_2013
Modello
class Bag(models.Model)
name = models.CharField()
class Item(models.Model)
name = models.CharField()
in_bag = models.ForeignKey(Bag)
Visualizza
class IndexView(generic.ListView):
model = Bag
template_name = 'sometemplate_2013.html'
Nome app: App_v2_2014
Modello
class Bag(models.Model)
bag_name = models.CharField()
owner = models.ForeignKey(User)
class Item(models.Model)
name = models.CharField()
in_bag = models.ForeignKey(Bag)
Visualizza
class IndexView(generic.ListView):
model = Bag
template_name = 'sometemplate_2014.html'
Come puoi vedere, il mio problema più grande è la violazione del principio DRY. Tutto viene incollato sulla copia, ma sono le stesse informazioni.