Задать вопрос
fox_12
@fox_12
Расставляю биты, управляю заряженными частицами

Подмена полей модели «на лету»?

В 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, и я никак не соображу как там подменить нужное поле.
  • Вопрос задан
  • 251 просмотр
Подписаться 3 Оценить 3 комментария
Пригласить эксперта
Ответы на вопрос 1
@deliro
Создай свой класс на основе CharField, переопределив методы подготовки для сохранения в БД и извлечения. (to_python, get_db_prep_value)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы