Più versioni diverse di app simili in un unico progetto

1

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.

    
posta Christoffer Karlsson 18.07.2015 - 09:21
fonte

1 risposta

1

Potrei fraintendere alcuni dettagli della tua domanda, ma ci proverò comunque. Questo è come lo farei io:

Vorrei strutturare App1, App2, ecc ... come pacchetti Python , e farei la versione di questi pacchetti per mappare in App1_v1, App1_v2, App2_v1, ecc ...

Creerò quindi un altro pacchetto per site.com e lo eseguirò per mapparlo a site.com/2012, site.com/2013, ecc ...

Tutti questi pacchetti si trovano in repository separati.

Le diverse versioni del pacchetto site.com dipenderebbero dai pacchetti App1_vX, App2_vX, alle versioni appropriate.

Quindi distribuirò le diverse versioni di site.com a diversi server o almeno a diversi ambienti virtuali, poiché non è possibile installare più versioni della stessa app nello stesso ambiente.

Penso che sarebbe la soluzione più pulita.

    
risposta data 22.07.2015 - 01:27
fonte

Leggi altre domande sui tag