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)
精彩评论