Я хотел бы обновить таблицу с помощью Django - что-то вроде этого в сыром SQL:
update tbl_name set name = 'foo' where name = 'bar'
Мой первый результат примерно такой - но это противно, не так ли?
list = ModelClass.objects.filter(name = 'bar')
for obj in list:
obj.name = 'foo'
obj.save()
Есть ли более элегантный способ?
django
django-models
Томас Шварцль
источник
источник
ModelClass
подходе? ЗатемОтветы:
Обновить:
В версии Django 2.2 теперь есть параметр bulk_update .
Старый ответ:
Обратитесь к следующему разделу документации django
Короче говоря, вы должны быть в состоянии использовать:
Вы также можете использовать
F
объекты для увеличения количества строк:Смотрите документацию .
Однако обратите внимание, что:
ModelClass.save
метод (поэтому, если у вас есть какая-то логика внутри, он не будет запущен)..update()
на нарезанный QuerySet, он должен быть на оригинальном QuerySet , так что вы должны будете опираться на.filter()
и.exclude()
методе.источник
save()
,DateTimeField
поля сauto_now=True
( «модифицированными» столбцов) не будет обновляться.ModelClass.objects.filter(name = 'bar').update(name="foo")
не выполняет цель массового обновления, если у меня есть разные данные для разных идентификаторов, как я могу сделать это без использования цикла?Entry.objects.all().update(title=F('blog__title'))
. Документы имеют небольшое упоминание об этом. Если вы хотите получить данные из другой модели для обновления записей, вам нужно запустить цикл forРассмотрите возможность использования
django-bulk-update
найденного здесь на GitHub .Установка:
pip install django-bulk-update
Реализация: (код взят из проектов ReadMe файла)
Обновление: как отмечает Марк в комментариях, это не подходит для одновременного обновления тысяч строк. Хотя он подходит для небольших партий от 10 до 100 лет. Размер пакета, который вам подходит, зависит от вашего процессора и сложности запросов. Этот инструмент больше похож на тачку, чем на самосвал.
источник
Версия Django 2.2 теперь имеет
bulk_update
метод ( примечания к выпуску ).https://docs.djangoproject.com/en/stable/ref/models/querysets/#bulk-update
Пример:
источник
Если вы хотите установить одно и то же значение в коллекции строк , вы можете использовать метод update () в сочетании с любым термином запроса, чтобы обновить все строки в одном запросе:
Если вы хотите обновить коллекцию строк с различными значениями в зависимости от некоторых условий, вы можете в лучшем случае пакетировать обновления в соответствии со значениями. Допустим, у вас есть 1000 строк, в которых вы хотите установить для столбца одно из значений X, затем вы можете заранее подготовить пакеты, а затем только выполнить X запросов на обновление (каждая по сути имеет форму первого примера выше) + начальный SELECT -query.
Если каждая строка требует уникального значения, нет способа избежать одного запроса на обновление. Возможно, посмотрите на другие архитектуры, такие как CQRS / Event Sourcing, если вам нужна производительность в этом последнем случае.
источник
Вы можете обратиться по этой ссылке, чтобы получить больше информации о массовом обновлении и создании. Массовое обновление и создание
источник