开发者

How can I override get method in django Model?

I want to do encode the data before saving it to a database table and decode it after reading it from the database table. I wanted to override django get and save methods.

something 开发者_JAVA技巧like:

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 models have save method and I am able to override it and do what i want. But, they doesnt seem to have a get method which I can override. How can I achieve this? I want the data to be decoded on calling UserData.objects.all() or UserData.objects.get() or UserData.objects.filter() or any other such methods available


Try reading docs about writing custom manager. Remember, you are not calling get on Model, but on Model.objects, which is a some kind of Manager. Here are the docs: https://docs.djangoproject.com/en/dev/topics/db/managers/


Usually, you do this by overriding __init__. But since __init__ on Django Models does all kind of funky business, it's not recommended to override it. Instead, listen for the post_init signal and do your decoding there:

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

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜