Django - как обновить базу данных с помощью выражения поля?
Мы используем Django для нашего сайта, и я хочу удалить личную информацию из одной из баз данных. Например, я хочу изменить адреса электронной почты на их id
+ "@example.com"
. Я могу сделать это с помощью Python:
for e in UserEmailAddress.objects.all():
e.email="{}@example.com".format(e.id)
e.save()
Но это занимает много времени, если у меня много пользователей. Есть ли способ сделать это с помощью UserEmailAddress.objects.all().update(...)
одной командой, которая будет делать то же самое? Я пытался использовать класс F
, но он не сработал, возможно, я использовал его неправильно.
Я также хочу фильтровать и исключать по этим выражениям - например, запрашивать всех пользователей, кроме пользователей, где их e.email=="{}@example.com".format(e.id)
. Я попробовал оба запроса:
from django.db.models import F
el = UserEmailAddress.objects.all().filter(email="{}@example.com".format(F('id')))
print(len(el))
el = UserEmailAddress.objects.all().exclude(email="{}@example.com".format(F('id')))
print(len(el))
Оба они возвращают неверные результаты (не то, что я ожидал).
OK, благодаря Нику я нашел решение:
from django.db.models import Value
from django.db.models.functions import Concat
UserEmailAddress.objects.all().update(email=Concat('id', Value('@example.com')))
el = UserEmailAddress.objects.all().filter(email=Concat('id', Value('@example.com')))
print(len(el))
el = UserEmailAddress.objects.all().exclude(email=Concat('id', Value('@example.com')))
print(len(el))
Ссылка: Django: Использование выражения F для текстового поля в вызове обновления