@borisalekseev
extra beginner junior python backend

Изменение значения поля: как оптимизировать ORM запрос?

Добрый день!
Прохожусь циклом по результату запроса к базе (по объекту QuerySet) и на основании данных объекта изменяю поля таблицы. Не могу понять, не выполняется ли у меня, часом, два запроса вместо одного? Можно ли ускорить такую операцию? Обязательно ли вызывать .save() каждый раз, или можно как то один раз в конце?
Вот модель
from myapp.models import SourceDistinct
# a - объект QuerySet {'description': description, 'num_descs': num_descs}
for i in a:
    b = SourceDistinct.objects.get(description=i['description'])
    b.frequency = i['num_descs'] #
    b.save()
  • Вопрос задан
  • 45 просмотров
Решения вопроса 1
@bacon
у тебя там не два, а куча запросов, по два на длину a
1. а почему SourceDistinct и объекты из a связаны через description, а не нормальным отношениями БД?
2. а еще почитай про транзакции https://docs.djangoproject.com/en/4.0/topics/db/tr... или про bulk_update https://docs.djangoproject.com/en/4.0/ref/models/q...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@borisalekseev Автор вопроса
extra beginner junior python backend
Кто ещё будет интересоваться, показываю как я в итоге сделал.
Запихнул нужные мне записи в датафрейм (важно назвать колонки так же как в модели джанго, чтобы можно было распаковать), и записал порциями по 100. На примерно миллион строк ушло 250 секунд.
bulk_list, count = [], 0
for i, string in df.iterrows():
    bulk_list.append(SourceDistinct(**string))
    count += 1
    if not count % 100:
        SourceDistinct.objects.bulk_create(bulk_list)
        bulk_list.clear()
SourceDistinct.objects.bulk_create(bulk_list)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы