Django добавляет список других моделей для корзины и товара
Я пытаюсь создать магазин, в котором пользователи могут добавлять товары на продажу, а другие пользователи могут добавлять их в корзину. Я не могу понять, как я могу сделать так, чтобы корзина содержала несколько продуктов и их количество.
class Product(models.Model):
name = models.TextField()
description = models.TextField()
price = models.FloatField()
quantity = models.FloatField()
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
class Cart(models.Model):
#list of products
#list of quantities
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
Вы можете сделать модель между ними и использовать ее в качестве through=…
[Django-doc]. В этой модели используется ForeignKey
для Product
, ForeignKey
для Cart
, и IntegerField
для количества:
class Product(models.Model):
name = models.TextField()
description = models.TextField()
price = models.FloatField()
quantity = models.FloatField()
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
class Cart(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
products = models.ManyToManyField(
Product,
related_name='carts',
through='CartProduct'
)
class CartProduct(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE)
cart = models.ForeignKey(Cart, on_delete=models.CASCADE)
quantity = models.IntegerField(default=1)
class Meta:
constraints = [
models.UniqueField(fields=['product', 'cart'], name='unique_product_cart')
]
Таким образом, вы добавляете товары в корзину, создавая (или обновляя) CartOrder
с заданными product
и cart
. В случае если комбинация корзины и товара уже существует, вы можете увеличить его количество.
Кроме того, вы можете итерировать набор запросов mycart.cardproduct_set.all()
для получения количества, например, мы можем вывести названия продуктов с их количеством следующим образом:
mycart = … # some cart
for cartproduct in mycart.cartproduct_set.select_related('product'):
print(f'{cartproduct.product.name}: {cartproduct.quantity}')