2010-03-22 11 views
6

Ich mag die Daten tun kodieren, bevor es zu einer Datenbanktabelle speichern und entschlüsseln, nachdem es aus der Datenbanktabelle zu lesen. Ich wollte django Methoden abschaffen und speichern.Wie kann ich get-Methode in django Modell außer Kraft setzen?

so etwas wie:

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) 

django Modelle haben Speichermethode, und ich bin in der Lage, es zu überschreiben und tun, was ich will. Aber sie scheinen keine Methode zu haben, die ich überschreiben kann. Wie kann ich das erreichen? Ich möchte die Daten beim Aufruf UserData.objects.all() oder UserData.objects.get() oder UserData.objects.filter() oder andere solche Methoden verfügbar

Antwort

5

Normalerweise tun Sie dies durch Überschreiben __init__. Aber seit __init__ auf Django Models alle Arten von funky Geschäft macht, ist es nicht zu empfehlen, es zu überschreiben. Stattdessen hören die post_init Signal und tun Sie Ihre Dekodierung dort:

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

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

Schön und einfach, yum –

+0

Dies war sehr hilfreich, danke. Django signalisiert Dokumentation: https://docs.djangoproject.com/de/dev/ref/signals/ –

6

Versuchen Lesung Dokumente über das Schreiben von benutzerdefinierten Manager decodiert werden . Denken Sie daran, Sie rufen nicht auf Model, sondern auf Model.objects, die eine Art von Manager ist. Hier sind die Dokumente:

+1

es auf diese Weise tun würden Sie schließlich benötigen Sie eine benutzerdefinierte QuerySet als auch, wie die get, Filter und alle Methoden auf einem Manager erstellen gerade noch passieren zu die entsprechenden Methoden im QuerySet, die von der Methode get_query_set des Managers zurückgegeben werden. –

+2

Diese Seite existiert nicht. – Alagu

+0

Anscheinend wurde es bewegt. https://docs.djangoproject.com/de/1.3/topics/db/managers/ – gruszczy

Verwandte Themen