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 для текстового поля в вызове обновления

Вернуться на верх