Skip to content

Задание 2

Условие

  • Где это необходимо, добавьте related_name к полям модели
  • Выведите все машины марки "Toyota" (или любой другой марки, которая у вас есть)
  • Найти всех водителей с именем “Олег” (или любым другим именем на ваше усмотрение)
  • Взяв любого случайного владельца, получить его id, и по этому id получить экземпляр удостоверения в виде объекта модели (можно в 2 запроса)
  • Вывести всех владельцев красных машин (или любого другого цвета, который у вас присутствует)
  • Найти всех владельцев, чей год владения машиной начинается с 2010 (или любой другой год, который присутствует у вас в базе)

Подготовка

Добавим related_name к ForeignKey. Также для корректного отображения объектов определим для каждого класса метод __str__. Теперь файл models.py выглядит следующим образом:

from django.contrib.auth.models import AbstractUser
from django.db import models


class Car(models.Model):
    registration_number = models.CharField(max_length=15)
    brand = models.CharField(max_length=20)
    model = models.CharField(max_length=20)
    color = models.CharField(max_length=30)

    def __str__(self):
        return f"Car {self.registration_number}"


class CarOwner(models.Model):
    last_name = models.CharField(max_length=30)
    first_name = models.CharField(max_length=30)
    birth_date = models.DateTimeField()
    cars = models.ManyToManyField(
        Car,
        through="Ownership",
        through_fields=("owner", "car"),
        related_name="owners"
    )

    def __str__(self):
        return f"Car {self.first_name} {self.last_name}"


class Ownership(models.Model):
    owner = models.ForeignKey(CarOwner, on_delete=models.CASCADE, related_name="ownerships", null=True)
    car = models.ForeignKey(Car, on_delete=models.CASCADE, related_name="ownerships", null=True)
    start_date = models.DateTimeField()
    end_date = models.DateTimeField(null=True)

    def __str__(self):
        return f"Ownership {self.car} of {self.owner}"


class DrivingLicense(models.Model):
    owner = models.ForeignKey(CarOwner, on_delete=models.CASCADE, related_name="licenses")
    license_number = models.CharField(max_length=10)
    type = models.CharField(max_length=10)
    issue_date = models.DateTimeField()

    def __str__(self):
        return f"DrivingLicense {self.license_number}"


class CustomUser(AbstractUser):
    passport_number = models.CharField(max_length=20)
    home_address = models.CharField(max_length=100)
    nationality = models.CharField(max_length=30)

Применим миграции и сделаем запросы к базе данных.

Запросы

Запрос 1

Выведем все машины марки Toyota:

Car.objects.filter(brand="Toyota")

Результат:

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

Запрос 2

Выведем всех водителей с именем Олег

CarOwner.objects.filter(first_name="Олег")

Результат:

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

Запрос 3

Найдём водительское удостоверение человека с именем Джон Смит. Для этого сначала определим его id, а далее по этому id найдём его удостоверение:

car_owner_john_id = CarOwner.objects.filter(first_name="Джон", last_name="Смит")[0].id
DrivingLicense.objects.filter(owner_id=car_owner_john_id)

Результат:

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

Запрос 4

Выведем всех владельцев красных машин:

CarOwner.objects.filter(cars__color='Red').distinct()

Результат:

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

Запрос 5

Выведем всех владельцев, чей год владения машиной начинается с 2023:

CarOwner.objects.filter(ownerships__start_date__year__gte=2023).distinct()

Результат:

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