Django Cart-产品的多个配置选项

时间:2019-04-10 12:55:14

标签: django postgresql django-models

我想创建一个Django Web应用程序,用户可以在其中将商品添加到购物车中。

在没有模型ColourSize的情况下,到目前为止,该方法仍然有效。

我的问题是,我无法弄清楚如何正确配置ColourSize这样的配置选项。

我添加了两个具有多对一关系的“选项”。我现在可以为产品添加多种颜色和尺寸,但是不知道如何将所选的“选项”保存在CartEntry

这是我到目前为止所得到的:

from django.db import models
from django.contrib.auth.models import User

class Product(models.Model):
    name = models.CharField(max_length=256)
    price = models.DecimalField(max_digits=6, decimal_places=2)
    def __str__(self):
        return str(self.name)


class Colour(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name="rel_colour")
    option = models.CharField(max_length=24)
    price = models.DecimalField(max_digits=6, decimal_places=2)
    def __str__(self):
        return str(self.colour)

class Size(models.Model):
    product =models.ForeignKey(Product, on_delete=models.CASCADE, related_name="rel_size")
    option = models.CharField(max_length=24)
    price = models.DecimalField(max_digits=6, decimal_places=2)
    def __str__(self):
        return str(self.size)



class Cart(models.Model):
    user        = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE)
    products    = models.ManyToManyField(Product, blank=True)
    updated     = models.DateTimeField(auto_now=True)
    timestamp   = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return str(self.id) + ' - ' + str(self.user)


class CartEntry(models.Model):
    product = models.ForeignKey(Product, null=True, on_delete=models.CASCADE)
    cart = models.ForeignKey(Cart, null=True, on_delete=models.CASCADE)
    quantity = models.PositiveIntegerField()

    def __str__(self):
        return str(self.quantity) + ', ' + str(self.product.name)

也许我不能在这里与CartEntry建立用户关系?

1 个答案:

答案 0 :(得分:0)

为什么不这样:

    from django.db import models
    from django.contrib.auth.models import User

    class Product(models.Model):
        name = models.CharField(max_length=256)
        colour = models.ForeignKey(Colour, on_delete=models.CASCADE)
        size = models.ForeignKey(Size, on_delete=models.CASCADE)
        price = models.DecimalField(max_digits=6, decimal_places=2)
        def __str__(self):
            return str(self.name)

    class Colour(models.Model):
        name = models.CharField(max_length=24)
        def __str__(self):
            return str(self.name)

    class Size(models.Model):
        name = models.CharField(max_length=24)
        def __str__(self):
            return str(self.name)

所以每种产品都有不同的颜色和尺寸。或者,如果您想将产品设为“父级”,则可以再添加1个模型,例如说VariantProduct

    class Product(models.Model):
        name = models.CharField(max_length=256)
        def __str__(self):
            return str(self.name)

    class VariantProduct(models.Model):
        product = models.ForeignKey(Product, on_delete=models.CASCADE)
        name = models.CharField(max_length=256)
        colour = models.ForeignKey(Colour, on_delete=models.CASCADE)
        size = models.ForeignKey(Size, on_delete=models.CASCADE)
        price = models.DecimalField(max_digits=6, decimal_places=2)
        def __str__(self):
            return str(self.name)