Обновление таблицы 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)