Python: Корзина покупок

Python: Django ORM 1 сообщение
Обновлено: 08 сент., 18:31
6
Студентов
83%
Завершения

django_project/app/models.py

Вам даны модели корзины для покупок ShoppingCart и товара ShopItem. Наличие товаров в корзине будет описывать модель ShoppingCartPosition. Кроме связи корзины и товара нужно знать количество товаров в корзине, эта информация тоже должна храниться в ShoppingCartPosition. Должно быть невозможно добавить один и тот же товар в корзину дважды — это должно быть ограничение (constraint) на уровне БД.

Задачи:

  • Описать необходимые поля модели ShoppingCartPosition.

  • Сгенерировать миграции.

  • Реализовать метод ShoppingCart.add(), который должен добавлять товар в корзину в указанном количестве:

    >>> cart = models.ShoppingCart.objects.create()
    >>> apple = models.ShopItem.objects.create(name='apple', price=2.0)
    >>> pear = models.ShopItem.objects.create(name='pear', price=3.0)
    >>> cart.add(apple, 2)
    >>> cart.add(pear)  # по умолчанию добавляется одна штука
    >>>
    
  • Реализовать свойство ShoppingCart.total_price, которое должно возвращать суммарную стоимость товаров в корзине с учётом их количества:

    >>> cart.total_price == 2 * 2.0 + 1 * 3.0
    True
    >>>
    
  • Реализовать метод ShoppingCart.preview(), который должен возвращать итератор пар, каждая из которых состоит из наименования товара (строка) и количества товаров этого вида в корзине. Элементы итератора должны быть отсортированы по порядку убывания итоговой цены позиции в корзине: сотня салфеток ценой в 10коп каждая — 10руб в сумме — должна идти раньше пары яблок по 2руб за каждое или 4руб в сумме.

    >>> for name, quantity in cart.preview():
    ...     print(quantity, '×', name)
    ...
    2 × apple
    1 × pear
    >>> # пара яблок дороже одной груши!
    

Подсказка

  • Для ShoppingCart.preview() вам пригодятся аннотирование и F-выражения.
  • Для ShoppingCart.total_price вам пригодятся те же F-выражения и агрегация.
  • Чтобы обеспечить уникальность товаров в корзине, укажите для ShoppingCartPosition ограничение unique_together.

Для полного доступа к испытанию нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов