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}')
Вернуться на верх