2010-03-22 39 views
6

我想在将数据保存到数据库表之前对数据进行编码,并在从数据库表中读取数据之后对其进行解码。我想覆盖django获取和保存方法。如何覆盖django模型中的get方法?

类似:

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模型有保存方法,我能够覆盖它,做我想做的。但是,他们似乎没有get方法,我可以覆盖。 我该如何做到这一点?我想要在调用UserData.objects.all()或UserData.objects.get()或UserData.objects.get()或任何其他此类可用方法时解码数据。

回答

5

通常,你通过覆盖__init__来做到这一点。但由于Django Models上的__init__做了各种各样的时髦业务,所以不推荐重写它。相反,监听post_init信号,并在那里做你的解码:

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

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

不错,简单,yum –

+0

这非常有帮助,谢谢。 Django发出文档信号:https://docs.djangoproject.com/en/dev/ref/signals/ –

6

尝试阅读有关编写自定义管理器的文档。记住,你不打电话Model,但在Model.objects,这是一种经理。这里是文档: https://docs.djangoproject.com/en/dev/topics/db/managers/

+1

这样做,这样最终会要求您创建一个自定义的查询集为好,因为get,过滤器和一个经理的所有方法仅仅是传递了由Manager的get_query_set方法返回的QuerySet上的相应方法。 –

+2

该页面不存在。 – Alagu

+0

显然它被移动了。 https://docs.djangoproject.com/en/1.3/topics/db/managers/ – gruszczy