Atualização em massa no Django

Vaibhav Vaibhav 30 janeiro 2023
  1. Método bulk_update() no Django
  2. Desvantagens do método bulk_update()
Atualização em massa no Django

No Django, por padrão, todo model possui um gerenciador de objects. Este gerenciador pode fazer muitas coisas, como buscar instâncias de modelo, filtrar instâncias de modelo, deletar instâncias de modelo. Podemos até criar nosso próprio gerenciador, herdando o gerenciador de base fornecido pelo Django.

Agora, cada consulta que aplicamos, como recuperar uma única instância de modelo usando a função get() ou filtrar instâncias usando o método filter(), atinge o banco de dados uma vez. Isso significa que se tivermos cinco instruções get() como segue, o banco de dados será consultado cinco vezes individualmente.

person = Person.objects.get(id=1)
person = Person.objects.get(id=2)
person = Person.objects.get(id=3)
person = Person.objects.get(id=4)
person = Person.objects.get(id=5)

Esta é uma abordagem ineficiente porque estamos acessando o banco de dados individualmente para uma única tarefa. Se tivermos que consultar muitas instâncias ou atualizar muitas instâncias para alguns modelos, essa abordagem pode tornar nosso aplicativo drasticamente lento.

Para resolver este problema, o Django tem uma função embutida que pode ser usada para atualizar várias instâncias em uma consulta, geralmente.

Método bulk_update() no Django

O método bulk_update tem três parâmetros, a saber, objs, fields e batch_size.

  1. objs - Uma lista de operações a serem realizadas
  2. fields - Uma lista de campos nos quais as consultas devem ser realizadas
  3. batch_size - O número de objetos a serem salvos em uma única consulta ao banco de dados. É um argumento opcional. Por padrão, todos os objetos são atualizados e salvos.

Considere um exemplo. Suponha que temos um modelo Person e temos que incrementar a idade de todas as pessoas em 1 usando o método bulk_update(). Faríamos o seguinte.

Em models.py:

from django.db import models


class Person(models.Model):
    username = models.CharField(max_length=200, unique=True)
    firstName = models.CharField(max_length=200)
    middleName = models.CharField(max_length=200)
    lastName = models.CharField(max_length=200)
    age = models.IntegerField(default=0)

Em views.py:

people = Person.objects.all()

for person in people:
    person.age += 1

Person.objects.bulk_update(people, update_fields=["age"])

Esta operação irá atualizar a idade de todas as pessoas em uma única consulta, o que é muito eficiente.

Desvantagens do método bulk_update()

O método bulk_update() é excelente, mas nem todo o glitter é ouro. Este método tem algumas desvantagens.

  • Usando o método bulk_update(), não podemos atualizar as chaves primárias das instâncias.
  • Todo modelo possui um método save(). Este método não é chamado ao usar o método bulk_update().
  • Temos que mencionar o tamanho do lote se estivermos atualizando muitas colunas para muitos registros. Caso contrário, a consulta SQL gerada será muito longa.
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.