Модель продуктов Django для сайта электронной коммерции

#django #e-commerce #product-variations

Вопрос:

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

 from django.db import models from colorfield.fields import ColorField # Create your models here.    class Color(models.Model):    Color = models.CharField(max_length=120,null=True,blank=True)  value = ColorField(default='#FF0000')   def __str__(self):  return self.Color   class Size(models.Model):    Size = models.CharField(max_length=120,null=True,blank=True)   def __str__(self):  return self.Size    class Product(models.Model):    title = models.CharField(max_length=120,null=True,blank=True)      def __str__(self):  return self.title   class ProductVaraiant(models.Model):  product = models.ForeignKey(Product,on_delete=models.CASCADE,null=True,blank=True)  slug = models.CharField(max_length=120,null=True,blank=True)  Color = models.ForeignKey(Color,on_delete=models.CASCADE,null=True,blank=True,)  Size = models.ManyToManyField(Size)    def __str__(self):  return self.slug    

Комментарии:

1. В чем заключается ваш вопрос?

2. Если у каждого варианта есть запас , то поле запас входит в Variant модель.

3. @WillemVanOnsem Я хочу внедрить систему инвентаризации, поэтому, например, у меня есть желтый вариант продукта, этот желтый вариант доступен в 3 размерах: Маленький, Средний, Большой, и я хочу добавить количество продуктов для каждого размера : желтый вариант :S(3), M(5), L(2)

4. Я думаю, что в этом случае ProductVariant должно быть два ForeignKey s: один к Color , и один к Size и добавьте IntegerField к ProductVariant с количеством товаров, оставшихся на складе.

5. @Rvector да, но вариант имеет несколько размеров, я хочу, чтобы каждый из этих размеров имел свои индивидуальные запасы

Ответ №1:

Учитывая, что я правильно понимаю проблему , вы должны сделать вариант для комбинаций product , size и color , таким ForeignKey образом, с тремя другими моделями. Кроме того, вы можете сделать UniqueConstraint так, чтобы не вводить одно и то же ProductVariant для 3-го кортежа цвета/размера/продукта. Затем ProductVariant модель также может иметь IntegerField номер с количеством товаров на складе:

 class ProductVaraiant(models.Model):  product = models.ForeignKey(Product,on_delete=models.CASCADE)  color = models.ForeignKey(Color,on_delete=models.CASCADE)  size = models.ForeignKey(Size, on_delete=models.CASCADE)  amount_in_stock = models.IntegerField()   class Meta:  constraints = [  models.UniqueConstraint(  fields=['product', 'color', 'size'],  name='unique_prod_color_size_combo'  )  ] 

Комментарии:

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

2. @NAS: для a Product вы можете получить цвета с Color.objects.filter(productvariant__product=some_product).distinct() , и то же самое для Size . Это также делает возможным, что для некоторых цветов некоторые размеры не существуют.