Django: proprietà di memorizzazione nella cache per voci non modificabili

3

Mi chiedo se sia una buona idea fare quanto segue:

Ho un modello Django (che è correlato a una migrazione, quindi ha una voce del database) con un mucchio di proprietà. Accedervi sono ovviamente colpire il database ogni volta.

Ho anche molti metodi che usano queste proprietà, come:

def is_good(self):
  return not self.bad and self.good > self.threshold

E questi metodi sono usati piuttosto frequentemente. Quindi sto cercando di ridurre il più possibile le query del database, per le prestazioni.

Forse posso sfruttare il fatto che i miei modelli sono molto "statici", il che significa che la maggior parte di questi attributi non cambierà mai i loro valori, quindi self.bad o self.good e self.threshold saranno sempre conserva gli stessi valori e non cambierà mai nel database. Forse posso usare questo a mio vantaggio e cache is_good() per ridurre il lavoro del database?

def is_good(self):
  try:
    return self._is_good
  except AttributeError:
    self._is_good = not self.bad and self.good > self.threshold
  return self._is_good

Questa è una pratica comune e raccomandata?

    
posta dabadaba 09.01.2017 - 12:12
fonte

1 risposta

1

Django include un'utilità cached_property ; trasforma il tuo metodo in una proprietà (può essere letto come se fosse un attributo), ma dopo la prima esecuzione del metodo, viene sostituito dal suo valore di ritorno, quindi da quel momento in poi è solo un attributo con quel valore:

from django.utils.functional import cached_property

@cached_property
def is_good(self):
    return not self.bad and self.good > self.threshold

Ora lo usi come instance.is_good , senza () . Altrimenti funziona come quello che vuoi eccetto un po 'più veloce e senza il brutto attributo _is_good .

Detto questo, penso che il tuo metodo di esempio verrà probabilmente eseguito abbastanza rapidamente e dubito che questo sarà evidente.

Ci sono anche molti altri modi per fare il cacheing in Django, vedi la documentazione per il framework di cache .

    
risposta data 09.01.2017 - 12:44
fonte

Leggi altre domande sui tag