Как "массовое обновление" с 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()


есть ли более элегантный способ?

745   2  

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

    Ничего не найдено.