2010-03-22 14 views
6

Quiero codificar los datos antes de guardarlos en una tabla de base de datos y decodificarlos después de leerlos en la tabla de la base de datos. Quería anular los métodos de obtención y guardado de django.¿Cómo puedo anular el método get en django Model?

algo como:

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) 

modelos de Django tiene método para guardar y yo soy capaz de anular y hacer lo que quiera. Pero, parece que no tienen un método get que puedo anular. ¿Cómo puedo lograr esto? Quiero que los datos se decodifiquen al llamar a UserData.objects.all() o UserData.objects.get() o UserData.objects.filter() o cualquier otro de estos métodos disponibles

Respuesta

5

Generalmente, esto se hace anulando __init__. Pero desde __init__ en Django Models hace todo tipo de negocios funky, no se recomienda anularlo. En cambio, la escucha de la señal post_init y hacer su decodificación allí:

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

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

Agradable y simple, yum –

+0

Esto fue muy útil, gracias. Documentación de las señales de Django: https://docs.djangoproject.com/en/dev/ref/signals/ –

6

Intente leer documentos sobre cómo escribir un administrador personalizado . Recuerde, no está llamando al Model, sino al Model.objects, que es un tipo de Administrador. Aquí están los documentos: https://docs.djangoproject.com/en/dev/topics/db/managers/

+1

Hacerlo de esta manera en última instancia, sería necesario crear una costumbre QuerySet, así, como el GET, filtro y todos los métodos en un gestor sólo tiene que pasar a través de los métodos correspondientes en QuerySet devueltos por el método get_query_set del administrador. –

+2

Esa página no existe. – Alagu

+0

Aparentemente se movió. https://docs.djangoproject.com/en/1.3/topics/db/managers/ – gruszczy

Cuestiones relacionadas