Как "массовое обновление" с Django?
Я хотел бы обновить таблицу с Django-что-то вроде этого в raw 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()
есть ли более элегантный способ?
2 ответов:
относятся к
updateфункция в документации django:https://docs.djangoproject.com/en/dev/ref/models/querysets/#update.короче говоря, вы должны быть в состоянии использовать:
ModelClass.objects.filter(name='bar').update(name="foo")вы также можете использовать
Fобъекты для выполнения таких действий, как увеличение строк:from django.db.models import F Entry.objects.all().update(n_pingbacks=F('n_pingbacks') + 1)смотрите документацию:https://docs.djangoproject.com/en/1.9/topics/db/queries/
однако, обратите внимание, что:
- этот не будет использовать
ModelClass.saveметод (так что если у вас есть какая-то логика внутри он не будет срабатывать).- сигналы django не будут излучаться.
рассмотрите возможность использования
django-bulk-updateнашел здесь на GitHub.установка:
pip install django-bulk-updateреализовать: (код берется непосредственно из проекта ReadMe файла)
from bulk_update.helper import bulk_update random_names = ['Walter', 'The Dude', 'Donny', 'Jesus'] people = Person.objects.all() for person in people: r = random.randrange(4) person.name = random_names[r] bulk_update(people) # updates all columns using the default dbобновление: как отмечает Марк в комментариях, это не подходит для обновления тысяч строк сразу. Хотя она подходит для небольших партий 10 до 100. Размер пакета, который является правильным для вас, зависит от вашего процессора и сложности запросов. Этот инструмент больше похож тачка, а не самосвал.
Comments