#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
. Это также делает возможным, что для некоторых цветов некоторые размеры не существуют.