Обновление таблицы django, хэширование определенного поля в таблице

У меня есть таблица, которая выглядит примерно так

class PodUsage(models.Model):
    pod_id = models.CharField(max_length=256, db_index=True)
    pod_name = models.CharField(max_length=256)
    start_time = models.DateTimeField(blank=True, null=True, default=timezone.now)
    end_time = models.DateTimeField(blank=True, null=True)
    anonymised = models.BooleanField(default=False)
    user = models.ForeignKey("accounts.ServiceUser", null=True, blank=True, on_delete=models.CASCADE)

В соответствии с требованиями GDPR нам необходимо анонимизировать данные после определенного периода, что я абсолютно точно могу сделать в виде цикла:

  count = 0
  records = PodUsage.objects.filter(
            anonymised=False,
            start_time__lte=timezone.now() - timedelta(weeks=settings.DATA_ANONYMISING_PERIOD_WEEKS)
            )
  for record in records:
        record.pod_name = hashlib.sha256(record.pod_name.encode('utf-8')).hexdigest()
        record.user = None
        record.anonymised = True
        record.save()
        count += 1
  # Log count somewhere

Однако я думаю, что я должен быть в состоянии сделать это с помощью update функции:

  count = PodUsage.objects.filter(
        anonymised=False,
        start_time__lte=timezone.now() - timedelta(weeks=settings.DATA_ANONYMISING_PERIOD_WEEKS)
        ).update(
            pod_name = hashlib.sha256(pod_name.encode('utf-8')).hexdigest(),
            user = None,
            anonymised = True
        )
  # Log count somewhere

....., но я не могу понять, как правильно ссылаться на поле в части обновления

  • как дано, pod_name не определено
  • sha256("pod_name".encode('utf-8')) очевидно просто кодирует строку "pod_name"
  • sha256(F("pod_name").encode('utf-8')) ломает код с 'F' object has no attribute 'encode'

Есть предложения?

Вы можете использовать функцию SHA256 [Django-doc], чтобы сообщить базе данных хэш:

from django.db.models.functions import SHA256

count = PodUsage.objects.filter(
    anonymised=False,
    start_time__lte=timezone.now()
    - timedelta(weeks=settings.DATA_ANONYMISING_PERIOD_WEEKS),
).update(pod_name=SHA256('pod_name'), user=None, anonymised=True)
Вернуться на верх