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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top