Editando e Excluindo Objetos de Modelos no Django
O Django oferece métodos eficientes para editar e excluir objetos de modelos diretamente no banco de dados. Abaixo estão os detalhes sobre essas operações, usando o modelo Person
como exemplo:
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=20)
age = models.IntegerField()
Atualização de Objetos
save()
O método save()
pode ser usado para salvar alterações em um objeto existente:
bob = Person.objects.get(id=2)
bob.name = "Bob"
bob.save()
Por padrão, o Django atualiza completamente o objeto, incluindo os campos não modificados. Para otimizar o desempenho e atualizar apenas campos específicos, o parâmetro update_fields
pode ser utilizado:
bob = Person.objects.get(id=1)
bob.name = "Robert"
bob.save(update_fields=["name"])
update()
O método update()
( ou sua versão assíncrona, aupdate()
) é uma alternativa eficiente, especialmente quando não é necessário carregar o objeto na memória. Ele pode ser combinado com filter()
para atualizar diretamente no banco:
number = Person.objects.filter(id=1).update(name="Mike")
print(number) # Exibe o número de registros atualizados
Também é possível atualizar múltiplos campos simultaneamente:
Person.objects.filter(id=1).update(name="Mike", age=33)
Em casos onde os valores dependem de seus valores atuais, o uso da classe F
é recomendado. Ela permite realizar operações como somar, subtrair ou modificar valores de forma eficiente, sem carregar os objetos na memória.
from django.db.models import F
Person.objects.filter(id=2).update(age=F("age") + 1)
Nesse exemplo, o campo age
é incrementado em 1. O método update()
aplica alterações em todos os registros que atendem ao critério. Para atualizar toda a tabela, ele pode ser combinado com all()
:
Person.objects.all().update(age=F("age") + 1)
O método update_or_create()
(ou sua versão assíncrona, aupdate_or_create()
) combina atualização e criação. Ele atualiza o objeto que atende ao critério fornecido ou cria um novo caso nenhum objeto corresponda:
values_for_update = {"name": "Bob", "age": 31}
bob, created = Person.objects.update_or_create(id=2, defaults=values_for_update)
bulk_update()
O método bulk_update()
(ou sua versão assíncrona, abulk_update()
) permite atualizar múltiplos objetos em uma única operação:
from .models import Person
first_person = Person.objects.get(id=1)
first_person.name = "Tomas"
second_person = Person.objects.get(id=2)
second_person.age = 29
number = Person.objects.bulk_update([first_person, second_person], ["name", "age"])
print(number) # Exibe o número de registros atualizados (2 neste caso)
Nesse exemplo, o campo name
do primeiro objeto e o campo age
do segundo são atualizados. O método retorna o número de objetos atualizados. No entanto, ele apresenta algumas limitações, como não permitir alterações no campo de chave primária e ignorar duplicatas no conjunto de objetos.
Excluindo Objetos
O método delete()
(ou sua versão assíncrona, adelete()
) remove um objeto específico do banco de dados:
person = Person.objects.get(id=2)
person.delete()
Se não for necessário carregar o objeto na memória antes da exclusão, a combinação de filter()
com delete()
pode ser usada:
Person.objects.filter(id=2).delete()
Para excluir todos os objetos de uma tabela:
Person.objects.all().delete()
Documentação oficial: