Skip to content

Practical Work

models.py

3.1.1

Напишите запрос на создание 6-7 новых автовладельцев и 5-6 автомобилей, каждому автовладельцу назначьте удостоверение и от 1 до 3 автомобилей.

python manage.py shell

Автомобили

from project_first_app.models import *

Car.objects.create(license_plate="x000xx", brand="Mitsubishi", model="Mitsubishi Lancer 2017", color="#000000")

# <Car: 8 Mitsubishi Lancer 2017>

Car.objects.create(license_plate="x001xx", brand="Mitsubishi", model="Mitsubishi Outlander 2017", color="#000000")

Car.objects.create(license_plate="x002xx", brand="Lexus", model="Lexus ES 2015", color="#ffffff")

Car.objects.create(license_plate="x003xx", brand="Lexus", model="Lincoln MKZ 2015", color="#ffffff")

Car.objects.create(license_plate="x004xx", brand="Toyota", model="Toyota Land Cruiser 2008", color="#000000")

Car.objects.create(license_plate="x005xx", brand="Toyota", model="Toyota Tundra 2010", color="#ffffff")

# >>> Car.objects.all()
# <QuerySet [<Car: 8 Mitsubishi Lancer 2017>, <Car: 9 Mitsubishi Outlander 2017>, <Car: 10 Lexus ES 2015>, 
# <Car: 11 Lincoln MKZ 2015>, <Car: 12 Toyota Land Cruiser 2008>, <Car: 13 Toyota Tundra 2010>]>

Владения

from project_first_app.models import *
import datetime

Ownership.objects.create(car_id=Car.objects.get(pk=8), start_date=datetime.datetime(2018, 1, 1), end_date=(datetime.datetime(2018, 1, 1)) + datetime.timedelta(days=700))

Ownership.objects.create(car_id=Car.objects.get(pk=9), start_date=datetime.datetime(2018, 1, 1), end_date=(datetime.datetime(2018, 1, 1)) + datetime.timedelta(days=700))

Ownership.objects.create(car_id=Car.objects.get(pk=10), start_date=datetime.datetime(2017, 1, 1), end_date=(datetime.datetime(2018, 1, 1)) + datetime.timedelta(days=700))

Ownership.objects.create(car_id=Car.objects.get(pk=11), start_date=datetime.datetime(2020, 1, 1), end_date=(datetime.datetime(2020, 1, 1)) + datetime.timedelta(days=700))

Ownership.objects.create(car_id=Car.objects.get(pk=12), start_date=datetime.datetime(2020, 1, 1), end_date=(datetime.datetime(2020, 1, 1)) + datetime.timedelta(days=700))

Ownership.objects.create(car_id=Car.objects.get(pk=13), start_date=datetime.datetime(2010, 1, 1), end_date=(datetime.datetime(2015, 1, 1)) + datetime.timedelta(days=700))

Ownership.objects.create(car_id=Car.objects.get(pk=13), start_date=datetime.datetime(2015, 2, 1), end_date=(datetime.datetime(2020, 1, 1)) + datetime.timedelta(days=700))


# >>> Ownership.objects.all()  
# <QuerySet [<Ownership: 10 - 8 Mitsubishi Lancer 2017 (2018-2019)>, <Ownership: 11 - 9 Mitsubishi Outlander 2017 (2018-2019)>, <Ownership: 12 - 10 Lexus ES 2015 (2017-2019)>, <Ownership: 13 - 11 Lincoln MKZ 2015 (2020-2021)>, <Ownership: 14 - 12 Toyota Land Cruiser 2008 (2020-2021)>, <Ownership: 15 - 13 Toyota Tundra 2010 (2010-2016)>, <Ownership: 16 - 13 Toyota Tundra 2010 (2015-2021)>]>

Автовладельцы

from project_first_app.models import *
import datetime

owner = CarOwner.objects.create(first_name="Erin", last_name="Solstice", username="erin1",date_of_birth=datetime.datetime(1999, 1, 1), passport="1234", address="", nationality="")
owner.ownership_id.set(Ownership.objects.filter(pk=10))

owner = CarOwner.objects.create(first_name="Zorian", last_name="Kazinski", username="zorian1",date_of_birth=datetime.datetime(1992, 1, 1), passport="1111", address="", nationality="")
owner.ownership_id.set(Ownership.objects.filter(pk=11))

owner = CarOwner.objects.create(first_name="Garen", last_name="Redfang", username="garen1",date_of_birth=datetime.datetime(2005, 1, 1), passport="2222", address="", nationality="goblin")
owner.ownership_id.set(Ownership.objects.filter(pk=12))

owner = CarOwner.objects.create(first_name="Juniper", last_name="Smith", username="juniper1",date_of_birth=datetime.datetime(1998, 1, 1), passport="3333", address="", nationality="USA")
owner.ownership_id.set(Ownership.objects.filter(pk=13))

owner = CarOwner.objects.create(first_name="Ivan", last_name="Petrov", username="ivan1",date_of_birth=datetime.datetime(2000, 1, 1), passport="4444", address="", nationality="")
owner.ownership_id.set(Ownership.objects.filter(pk=14))

owner = CarOwner.objects.create(first_name="James", last_name="Garfield", username="garfield1",date_of_birth=datetime.datetime(1980, 1, 1), passport="5555", address="", nationality="cat")
owner.ownership_id.set(Ownership.objects.filter(pk__in=[15, 16]))

# >>> CarOwner.objects.all()
# <QuerySet [<CarOwner: 2 - admin ( )>, <CarOwner: 10 - erin1 (Erin Solstice)>, <CarOwner: 11 - zorian1 (Zorian Kazinski)>, <CarOwner: 12 - garen1 (Garen Redfang)>, <CarOwner: 13 - juniper1 (Juniper Smith)>, <CarOwner: 14 - ivan1 (Ivan Petrov)>, <CarOwner: 15 - garfield1 (James Garfield)>]>

Удостоверения

from project_first_app.models import *
import datetime


DriverLicense.objects.create(car_owner_id=CarOwner.objects.get(pk=10), serial_number="111111", license_type="B", issue_date=datetime.datetime(2018, 1, 1))

DriverLicense.objects.create(car_owner_id=CarOwner.objects.get(pk=11), serial_number="222222", license_type="B", issue_date=datetime.datetime(2018, 5, 1))

DriverLicense.objects.create(car_owner_id=CarOwner.objects.get(pk=12), serial_number="333333", license_type="B", issue_date=datetime.datetime(2019, 1, 1))

DriverLicense.objects.create(car_owner_id=CarOwner.objects.get(pk=13), serial_number="444444", license_type="B", issue_date=datetime.datetime(2019, 5, 1))

DriverLicense.objects.create(car_owner_id=CarOwner.objects.get(pk=14), serial_number="555555", license_type="B", issue_date=datetime.datetime(2019, 1, 1))

DriverLicense.objects.create(car_owner_id=CarOwner.objects.get(pk=15), serial_number="666666", license_type="B", issue_date=datetime.datetime(2019, 1, 1))

# >>> DriverLicense.objects.all()
# <QuerySet [<DriverLicense: B - 10 - erin1 (Erin Solstice) (111111)>, <DriverLicense: B - 11 - zorian1 (Zorian Kazinski) (222222)>, <DriverLicense: B - 12 - garen1 (Garen Redfang) (333333)>, <DriverLicense: B - 
# 13 - juniper1 (Juniper Smith) (444444)>, <DriverLicense: B - 14 - ivan1 (Ivan Petrov) (555555)>, <DriverLicense: B - 15 - garfield1 (James Garfield) (666666)>]>

3.1.2

related_name | Stackoverflow

По созданным в пр.1 данным написать следующие запросы на фильтрацию:

  • Где это необходимо, добавьте related_name к полям модели
  • Выведете все машины марки “Toyota” (или любой другой марки, которая у вас есть)
from project_first_app.models import *

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

# <QuerySet [<Car: 12 Toyota Land Cruiser 2008>, <Car: 13 Toyota Tundra 2010>]>
  • Найти всех водителей с именем “Олег” (или любым другим именем на ваше усмотрение)
from project_first_app.models import *

CarOwner.objects.filter(first_name="Erin")
# <QuerySet [<CarOwner: 10 - erin1 (Erin Solstice)>]>
  • Взяв любого случайного владельца получить его id, и по этому id получить экземпляр удостоверения в виде объекта модели (можно в 2 запроса)
from project_first_app.models import *
import random

owners = list(CarOwner.objects.all())
random_owner = random.choice(owners)

# >>> random_owner
# <CarOwner: 11 - zorian1 (Zorian Kazinski)>

DriverLicense.objects.filter(car_owner_id=random_owner.pk).first()
# <DriverLicense: B - 11 - zorian1 (Zorian Kazinski) (222222)>
  • Вывести всех владельцев красных машин (или любого другого цвета, который у вас присутствует)
from project_first_app.models import *

CarOwner.objects.filter(ownership_id__car_id__color="#000000")
# <QuerySet [<CarOwner: 10 - erin1 (Erin Solstice)>, <CarOwner: 11 - zorian1 (Zorian Kazinski)>, <CarOwner: 14 - ivan1 (Ivan Petrov)>]>
  • Найти всех владельцев, чей год владения машиной начинается с 2010 (или любой другой год, который присутствует у вас в базе)
from project_first_app.models import *
import datetime

CarOwner.objects.filter(ownership_id__start_date__gte=datetime.datetime(2018, 1, 1))
# <QuerySet [<CarOwner: 10 - erin1 (Erin Solstice)>, <CarOwner: 11 - zorian1 (Zorian Kazinski)>, <CarOwner: 13 - juniper1 (Juniper Smith)>, <CarOwner: 14 - ivan1 (Ivan Petrov)>]>

3.1.3

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

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

    from project_first_app.models import *
    
    DriverLicense.objects.all().order_by("issue_date").first().issue_date.strftime("%Y.%m.%d")
    # '2018.01.01'
    

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

    from project_first_app.models import *
    import datetime
    
    
    Ownership.objects.all().order_by('-end_date').first().end_date.strftime("%Y.%m.%d")
    # '2021.12.01'
    
    # Или же имелось ввиду?: 
    
    Ownership.objects.filter(end_date__gte=datetime.datetime(2021, 12, 1))
    # <QuerySet [<Ownership: 13 - 11 Lincoln MKZ 2015 (2020-2021)>, <Ownership: 14 - 12 Toyota Land Cruiser 2008 (2020-2021)>, <Ownership: 16 - 13 Toyota Tundra 2010 (2015-2021)>]>
    

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

    from project_first_app.models import *
    from django.db.models import Count
    
    CarOwner.objects.values('username').annotate(car_count=Count("ownership_id"))
    # <QuerySet [{'username': 'admin', 'car_count': 0}, {'username': 'erin1', 'car_count': 1}, {'username': 'garen1', 'car_count': 1}, {'username': 'garfield1', 'car_count': 2}, {'username': 'ivan1', 'car_count': 1}, {'username': 'juniper1', 'car_count': 1}, {'username': 'zorian1', 'car_count': 1}]>
    

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

    from project_first_app.models import *
    from django.db.models import Count
    
    Car.objects.values('brand').annotate(brand_count=Count("brand"))
    # <QuerySet [{'brand': 'Lexus', 'brand_count': 2}, {'brand': 'Mitsubishi', 'brand_count': 2}, {'brand': 'Toyota', 'brand_count': 2}]>
    

  • Отсортируйте всех автовладельцев по дате выдачи удостоверения

from project_first_app.models import *

CarOwner.objects.all().order_by('driverlicense__issue_date')
# <QuerySet [<CarOwner: 2 - admin ( )>, <CarOwner: 10 - erin1 (Erin Solstice)>, <CarOwner: 11 - zorian1 (Zorian Kazinski)>, <CarOwner: 12 - garen1 (Garen Redfang)>, <CarOwner: 14 - ivan1 (Ivan Petrov)>, <CarOwner: 15 - garfield1 (James Garfield)>, <CarOwner: 13 - juniper1 (Juniper Smith)>]>

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

3.2.1

views.py, serializers.py, urls.py

Реализовать ендпоинты для добавления и просмотра скилов методом, описанным в пункте выше.

3.2.2

Реализовать ендпоинты: - Вывод полной информации о всех войнах и их профессиях (в одном запросе).

  • Вывод полной информации о всех войнах и их скилах (в одном запросе).

  • Вывод полной информации о войне (по id), его профессиях и скилах.

  • Удаление война по id.

  • Редактирование информации о войне.