Django e personalizzazione di un database legacy
-
18-09-2019 - |
Domanda
Attualmente sto lavorando a un progetto per implementare un'interfaccia Django su un'applicazione di calendario esistente.L'applicazione del calendario ha MySQL come DB backend.
Nella nostra applicazione personalizzata vorremmo modificare/estendere i dati in una delle tabelle utilizzate dall'applicazione calendario esistente, ad es.
# Auto-generated by inspectdb - table used by calendar application
class CalendarEvent(models.Model:)
name = models.CharField(max_length=80)
start_time = models.DateTimeField()
end_time = models.DateTimeField()
# Manually created table
class CustomCalendarEvent(models.Model:)
code = models.CharField(max_length=80) # Mapped from name
length = models.DateTimeField() # start_time - stop_time
.... additional data ....
Vorremmo anche che la nostra rappresentazione dei dati rimanesse sincronizzata con la tabella del calendario esistente, ad es.quando vengono inserite nuove voci nell'applicazione calendario, queste si propagheranno automaticamente alla nostra tabella personalizzata.
Mi vengono in mente un paio di modi ovvi per farlo (ad es.uno script di sincronizzazione avviato da cron o magari trigger MySQL) ma non ritengo che queste soluzioni siano particolarmente eleganti.
Una possibilità è usare a Gestore personalizzato per CustomCalendarEvent e sovrascrivere il file get_query_set funzionalità per attivare anche una funzione di sincronizzazione.
Si tratta di un uso legittimo di Django CustomManagers?In caso contrario, qualcuno può consigliare un approccio alternativo a questo problema?
Soluzione
Sembra che tu stia tentando di estendere CalendarEvent con più campi.
Innanzitutto, vorrei apportare questa modifica a CustomCalendarEvent:
code = models.CharField(max_length=80) # Mapped from name
calendar_event = models.ForeignKey(CalendarEvent)
e se la lunghezza calcola solo la differenza in giorni tra start_time e end_time, lo rimuoverei da CustomCalendarEvent e lo renderei invece richiamabile in CalendarEvent (solo un metodo che esegue il calcolo).
Non vuoi davvero duplicare i dati tra le due tabelle, che è ciò che ottieni quando lo hai name
in CalendarEvent e code
nell'evento CustomCalendar.Gli aggiornamenti al nome dovranno essere sincronizzati code
e non c'è motivo di farlo se tutto ciò che vuoi fare è estendere la tabella CalendarEvent con più campi.
Poi potresti sovrascrivere il file save()
E delete()
metodi affinché CalendarEvent propaghi la modifica di inserimenti/eliminazioni.Gli aggiornamenti, credo, non contano nel tuo caso poiché CustomCalendarEvent è solo un'estensione di CalendarEvent.
Approccio alternativo:utilizzare un trigger di inserimento nel database su CalendarEvent che propaga la voce a CustomCalendarEvent.Vorrei comunque che la tabella CustomCalendarEvent avesse una chiave esterna in CalendarEvent invece di duplicare i dati.
MODIFICARE:A proposito, non userei mai a gestore personalizzato per modificare i dati come stai suggerendo, anche come effetto collaterale di alcune operazioni di lettura.I manager si occupano di interrogare, non di modificare i dati.
Altri suggerimenti
Perché non usi l'ereditarietà del modello? CustomCalendarEvent
può ereditare da CalendarEvent
e aggiungi i nuovi campi in questo modo.