from django.conf import settings from django.core.validators import MinValueValidator from django.db import models from items.models import Item class Cart(models.Model): user = models.OneToOneField( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="cart", verbose_name="Пользователь", ) created_at = models.DateTimeField(auto_now_add=True, verbose_name="Дата создания") updated_at = models.DateTimeField(auto_now=True, verbose_name="Дата обновления") class Meta: verbose_name = "Корзина" verbose_name_plural = "Корзины" def __str__(self): return f"Корзина пользователя {self.user}" class CartItem(models.Model): cart = models.ForeignKey( Cart, on_delete=models.CASCADE, related_name="items", verbose_name="Корзина", ) item = models.ForeignKey( Item, on_delete=models.CASCADE, related_name="cart_entries", verbose_name="Товар", ) quantity = models.PositiveIntegerField( validators=[MinValueValidator(1)], verbose_name="Количество", ) created_at = models.DateTimeField(auto_now_add=True, verbose_name="Дата создания") updated_at = models.DateTimeField(auto_now=True, verbose_name="Дата обновления") class Meta: ordering = ("created_at", "id") constraints = [ models.UniqueConstraint(fields=("cart", "item"), name="unique_cart_item_per_cart"), ] verbose_name = "Позиция корзины" verbose_name_plural = "Позиции корзины" def __str__(self): return f"{self.item} x {self.quantity}" @property def subtotal(self): return self.item.price * self.quantity