Skip to content

Задание 3

Условие

Необходимо реализовать следующие запросы c применением описанных методов:

  • Вывод даты выдачи самого старшего водительского удостоверения

  • Укажите самую позднюю дату владения машиной, имеющую какую-то из существующих моделей в вашей базе

  • Выведите количество машин для каждого водителя

  • Подсчитайте количество машин каждой марки

  • Отсортируйте всех автовладельцев по дате выдачи удостоверения (примечание: чтобы не выводить несколько раз одни и те же таблицы воспользуйтесь методом .distinct())

Запросы

Запрос 1

Самое старшее водительское удостоверение — удостоверение с минимальной датой начала:

DrivingLicense.objects.aggregate(oldest_issue_date=Min("issue_date"))["oldest_issue_date"].strftime("%d.%m.%Y, %H:%M:%S")

Результат:

Результат_запроса_1

Запрос 2

Аналогично рассуждая, выведем дату максимального окончания владения автомобилем:

Ownership.objects.aggregate(latest_end_date=Max("end_date"))["latest_end_date"].strftime("%d.%m.%Y, %H:%M:%S")

Результат:

Результат_запроса_2

Запрос 3

Выведем количество машин для каждого автовладельца:

CarOwner.objects.annotate(num_cars=Count('cars')).values('id', 'num_cars')

Или в более удобном виде:

cars_per_owner = CarOwner.objects.annotate(num_cars=Count("cars")).values("id", "num_cars")
for item in cars_per_owner:
    print(CarOwner.objects.get(id=item["id"]), "has", item["num_cars"], "cars")

Результат:

Результат_запроса_3

Запрос 4

Выведем количество машин каждой марки:

Car.objects.values('brand').annotate(Count('id')).order_by("brand")

В более удобном виде:

car_brands_count = Car.objects.values("brand").annotate(Count("id")).order_by("brand")
for item in car_brands_count:
    print(item["brand"], "is presented by", item["id__count"], "cars")

Результат:

Результат_запроса_4

Запрос 5

Отсортируем автовладельцев по дате выдачи удостоверения (для определённости будем брать самое ранее). Стоит отметить, что в представленной базе данных не у всех есть водительское удостоверение, поэтому предварительно нужно отфильтровать водителей без лицензии:

CarOwner.objects.filter(
    licenses__isnull=False
).annotate(
    earliest_license_date=Min("licenses__issue_date")
).order_by(
    "earliest_license_date"
)

В более удобном виде:

owners_sorted_by_license_date = CarOwner.objects.filter(
    licenses__isnull=False
).annotate(
    earliest_license_date=Min("licenses__issue_date")
).order_by(
    "earliest_license_date"
)
print(*owners_sorted_by_license_date, sep="\n")

Результат:

Результат_запроса_5