Получение отдельных объектов и проверка их наличия

Последнее обновление: 26.08.2022

latest и earliest

Метод latest() (и его асинхронная версия alatest()) возвращает объект, где были самые последние изменения в определенных полях.

Метод earliest() (и его асинхронная версия aearliest()) возвращает объект, где были самые ранние изменения в определенных полях.

В качестве параметра оба метода принимают набор полей, на основании которых возвращается объект:

from .models import Person
 
# получаем объект с самыми последними изменениями в поле id
latest_person = Person.objects.latest("id")
print(f"{latest_person.name} - {latest_person.age}")

# получаем объект c самыми ранними изменениями в поле name
earliest_person = Person.objects.earliest("id")
print(f"{earliest_person.name} - {earliest_person.age}")

Можно передать набор полей:

# получаем объект с самыми последними изменениями в поле age 
# и с самыми ранними изменениями в поле name
latest_person = Person.objects.latest("age", "-name")
print(f"{latest_person.name} - {latest_person.age}")

Если передается поле c минусом, то поиск идет в обратном порядке: для метода latest идет поиск поля с самыми ранними изменениями, а для метода earliest - с самыми поздними изменениями.

Если ни одного объекта не найдено (например, в случае с пустым набором), оба метода генерируют исключение DoesNotExist

first и last

Метод first() (и его асинхронная версия afirst()) возвращает первый объект из набора.

Метод last() (и его асинхронная версия alast()) возвращает последний объект из набора.

from .models import Person
 
# получим первый объект
first_person = Person.objects.first()
print(f"{first_person.name} - {first_person.age}")

# получим последний объект
last_person = Person.objects.last()
print(f"{last_person.name} - {last_person.age}")

# получим первый объект из набора, отсортированного по возрасту
first_person = Person.objects.order_by("age").first()
print(f"{first_person.name} - {first_person.age}")

Если ни одного объекта не найдено (например, в случае с пустым набором), оба метода возвращают значение None

exists()

Метод exists() (и его асинхронная версия aexists()) возвращает True, если набор QuerySet содержит данные, и False - если не содержит:

from .models import Person
 
is_present = Person.objects.filter(name = "Tom").exists()
if is_present:
    print("в наборе есть объекты")
else:
    print("объекты в наборе отсутствуют")

contains()

Метод contains() (и его асинхронная версия acontains()) возвращает True, если набор QuerySet содержит определенный объект, и False - если не содержит:

from .models import Person
 
# получим последний объект
last_person = Person.objects.last()

# есть ли объект last_person среди тех, у которых age меньше 35
is_present = Person.objects.filter(age__lt=35).contains(last_person)
if is_present:
    print("объект есть в наборе")
else:
    print("объект отсутствует")
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850