2010-03-22 12 views
6

Voglio codificare i dati prima di salvarli in una tabella di database e decodificarli dopo averli letti dalla tabella del database. Volevo scavalcare i metodi per ottenere e salvare django.Come posso eseguire l'override del metodo get in django Model?

qualcosa di simile:

class UserData(models.Model): 
    userid = models.IntegerFields 
    data = models.charField(max_length=25) 

    def save(self, *args, **kwargs): 
     encode_data(self.data) 
     super(UserData, self).save(*args, **kwargs) 

    def get(self, *args, **kwargs): 
     data = super(UserData, self).get(*args, **kwargs) 
     return decode_data(data) 

modelli Django hanno metodo di salvataggio e sono in grado di ignorare e fare quello che voglio. Ma, loro non sembrano avere un metodo di ottenere che io possa ignorare. Come posso ottenere questo? Desidero che i dati vengano decodificati chiamando UserData.objects.all() o UserData.objects.get() o UserData.objects.filter() o altri metodi disponibili

risposta

5

Di solito, si esegue questa operazione ignorando __init__. Ma dal momento che il __init__ su Django Models fa tutti i tipi di affari funky, non è consigliabile ignorarlo. Invece, per ascoltare il segnale post_init e fare la tua decodifica c'è:

def my_decoder(instance, **kwargs): 
    instance.decoded_stuff = decode_this(instance.encoded.stuff) 

models.signals.post_init.connect(my_decoder, UserData) 
+0

Bello e semplice, yum –

+0

Questo è stato molto utile, grazie. Documentazione dei segnali di Django: https://docs.djangoproject.com/en/dev/ref/signals/ –

6

Provare a leggere i documenti relativi alla scrittura di un gestore personalizzato . Ricorda, non stai chiamando get su Model, ma su Model.objects, che è un qualche tipo di Manager. Ecco i documenti: https://docs.djangoproject.com/en/dev/topics/db/managers/

+1

Facendo in questo modo in ultima analisi avrebbe richiesto di creare un QuerySet personalizzato come bene, come get, filtro e tutti i metodi su un manager appena passano per i metodi corrispondenti sul QuerySet restituiti dal metodo get_query_set del Manager. –

+2

Quella pagina non esiste. – Alagu

+0

Apparentemente è stato spostato. https://docs.djangoproject.com/en/1.3/topics/db/managers/ – gruszczy

Problemi correlati