В Django создаю пользовательскую модель с шифрованным полем примерно как-то так:
class MyModelManager(models.Manager):
use_for_related_fields = True
def get(self, *args, **kwargs):
instance = super(MyModelManager, self).get(*args, **kwargs)
try:
instance.my_value = instance.decode_my_value()
except AttributeError:
pass
return instance
# Этот метод нужно как-то переопределить
def get_queryset(self, *args, **kwargs):
return super(MyModelManager, self).get_queryset(*args, **kwargs)
class MyModel(models.Model):
my_value = models.CharField(max_length=128)
objects = MyModelManager()
....
@property
def encode_my_value(self):
... алгоритм шифрации ...
return encoded
@property
def decode_my_value(self):
... алгоритм дешифрации ...
return decoded
# на лету шифруем данные в БД при сохранении
def save(self, *args, **kwargs):
self.my_value = self.encode_my_value()
super(MyModel, self).save(*args, **kwargs)
Поле шифруется "на лету" как положено, и в базе хранится уже зашифрованное значение.
При вызове MyModel.objects.get(id=some_id).my_value - поле расшифровывается "на лету"
Все хорошо, но это не работает для MyModel.objects.get_queryset()
Теперь вопрос - каким образом можно дописать менеджер, чтобы он возвращал QuerySet с уже дешифрованными значениями полей my_value. У менеджера есть для этого метод get_queryset, он он оперирует с QuerySet, и я никак не соображу как там подменить нужное поле.