Как "массовое обновление" с 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
Implement: (код взят непосредственно из файла 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. Размер пакета, который подходит именно вам, зависит от вашего процессора и сложности запроса. Этот инструмент больше похож на тачка на колесах, а не самосвал.