Django:电子商务的产品变体

时间:2018-09-18 08:23:52

标签: python django python-3.x django-models django-2.0

我正在尝试建立电子商务并配置产品变体和属性。在我的产品变型模型中,我想访问相关产品中的所有选定属性,并为每个产品添加一个值。

例如,如果我创建一个新产品并为变体选择两个属性:颜色和尺寸,那么我希望能够在为该产品创建变体时为每个变体动态创建一个字段。

这是我的models.py文件中的内容:

class Product(models.Model) :
    name = models.CharField(max_length=120)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    image = models.ImageField(upload_to='products')
    allow_variants = models.BooleanField(default=True)
    product_attributes = models.ManyToManyField("attribute")

    def __str__(self) :
        return self.name

    class Meta :
        ordering = ("name",)

class Attribute(models.Model) :
    name = models.CharField(max_length=120)

    def __str__(self) :
        return self.name

    def get_all_attr_variants(self) :
        variants = AttributeVariant.objects.filter(attribute__name=self.name)
        return variants

class AttributeVariant(models.Model) :
    name = models.CharField(max_length=120)
    attribute = models.ForeignKey(Attribute, on_delete=models.CASCADE)

    def __str__(self) :
        return self.name

    class Meta :
        ordering = ('name',)

class ProductVariant(models.Model) :

如果您对我的操作方法有任何了解,请帮助我。
谢谢!

1 个答案:

答案 0 :(得分:2)

Django不允许动态添加或删除字段。获得此效果的最佳方法是使用“ AttibuteValue”类, 像这样:

class ProductVariant(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)

class ProductAttributeValue(models.Model):
    variant = models.ForeignKey(ProductVariant, on_delete=models.CASCADE)
    attribute = models.ForeignKey(AttributeVariant, on_delete=models.CASCADE)

    value = models.CharField()  # Depending on what type you want

通过选择具有正确变体和属性的ProductAttributeValues,可以轻松获得变体的所有属性。