Criando e Recuperando Objetos de Modelos - Django
O Django oferece métodos para criar e recuperar objetos de modelos diretamente do banco de dados. A seguir, são apresentados detalhes sobre esses métodos, usando como exemplo o modelo Person
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=20)
age = models.IntegerField()
Adicionando Objetos ao Banco de Dados
create()
O método create()
tom = Person.objects.create(name="Tom", age=23)
print(tom.id)
Após a criação, o ID do objeto pode ser acessado por meio do atributo id
A versão assíncrona, chamada acreate(), permite adicionar objetos ao banco de dados de forma assíncrona:
from .models import Person
import asyncio
async def acreate_person():
person = await Person.objects.acreate(name="Sam", age=26)
print(person.name)
asyncio.run(acreate_person())
save()
Além disso, é possível criar e salvar objetos separadamente usando o método save()
tom = Person(name="Tom", age=23)
tom.save()
print(tom.id)
bulk_create()
Para criar múltiplos objetos de forma eficiente, o método bulk_create()
from .models import Person
people = Person.objects.bulk_create([
Person(name="Kate", age=24),
Person(name="Ann", age=21),
])
for person in people:
print(f"{person.id}. {person.name}")
Recuperando Objetos do Banco de Dados
get()
O método get()
tom = Person.objects.get(name="Tom")
bob = Person.objects.get(age=23)
Esse método deve ser usado com cuidado, pois gera exceções caso nenhum objeto seja encontrado (DoesNotExist
MultipleObjectsReturned
from .models import Person
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
try:
tom = Person.objects.get(name="Tom")
alex = Person.objects.get(name="Alex")
except ObjectDoesNotExist:
print("O objeto não existe.")
except MultipleObjectsReturned:
print("Mais de um objeto encontrado.")
A versão assíncrona do get()
aget()
from .models import Person
import asyncio
async def get_person():
person = await Person.objects.aget(id=1)
print(person.name)
asyncio.run(get_person())
get_or_create()
Além disso, existe o método get_or_create()
bob, created = Person.objects.get_or_create(name="Bob", age=24)
print(created) # True se o objeto foi criado, False se já existia
print(bob.name, bob.age) # Bob 24
all()
Para recuperar todos os objetos de uma tabela, o método all()
QuerySet
people = Person.objects.all()
filter()
Filtros podem ser aplicados para recuperar objetos específicos:
people = Person.objects.filter(age=23)
people2 = Person.objects.filter(name="Tom", age=23)
exclude()
Já o método exclude()
Os métodos filter()
exclude()
people = Person.objects.filter(name="Tom").exclude(age=23)
in_bulk()
Para recuperar objetos com base em uma lista de IDs, o método in_bulk()
# Recupera todos os objetos
people1 = Person.objects.in_bulk()
# Recupera os objetos com IDs 1 e 3
people2 = Person.objects.in_bulk([1, 3])
Limitando a Quantidade de Objetos Recuperados
A sintaxe de slicing pode ser usada para limitar os resultados de um QuerySet. Para obter os primeiros 5 objetos:
people = Person.objects.all()[:5]
Para ignorar os primeiros 5 objetos e obter os próximos 5:
people = Person.objects.all()[5:10]
No nível SQL, isso é traduzido para LIMIT e OFFSET.