Django: варианты продукта для электронной коммерции - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь создать электронную торговлю и настроить варианты продукта и атрибуты.В моих моделях вариантов продукта я хотел бы получить доступ ко всем выбранным атрибутам из соответствующего продукта и добавить значение для каждого продукта.

Например, если я создаю новый продукт и выбираю два атрибута для вариантов: цвет и размер, я хотел бы иметь возможность динамически создавать поле для каждого из них при создании варианта для этого продукта.

Вот что у меня есть в моем файле 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 голосов
/ 18 сентября 2018

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 с правильным вариантом и атрибутом.

...