我正在創建一個電子商務商店,銷售T恤衫、連帽衫、馬克杯、酒杯等。對于T恤衫和連帽衫,每個產品都有尺寸,有時還有顏色。我正試圖為每個產品添加多種變化。以下是我的model.py代碼:
class Category(models.Model) 。
名稱=模型。 CharField(max_length = 255, db_index=True。null=True, blank=True)
slug = models.SlugField(max_length=255, unique=True, default='' )
class Meta:
verbose_name_plural = 'categories'.
def get_absolute_url(self) 。
return reverse('main:category_list', args=[self.slug] )
def __str__(self) 。
return self.name
class Attribute(models.Model) 。
name = models.CharField(max_length = 255, default='' )
def __str__(self) 。
return self.name
class ProductAttribute(models.Model) 。
attribute = models.ManyToManyField(Attribute, through='Product' )
值=模型。 CharField(max_length = 255, null=True, blank=True)
def __str__(self) 。
回傳self.value
class Product(models.Model) 。
category = models.ForeignKey(Category, on_delete=models. CASCADE, null=True, blank=True)
name = models.CharField(max_length = 255, default='' )
description = models.TextField(blank=True)
影像 = 模型。 ImageField(upload_to='products/' 。null=True, blank=True)
slug = models.SlugField(max_length = 255, default='' )
price = models.DecimalField(max_digits=4,decimal_places=2)
has_attributes = models.BooleanField(default=False)
attribute = models.ForeignKey(Attribute, on_delete=models. CASCADE, null=True, blank=True)
value = models.ForeignKey(ProductAttribute, on_delete=models. CASCADE, null=True, blank=True)
class Meta:
ordering=(['name'])
def get_absolute_url(self) 。
return reverse('main:product_detail', args=[self.slug] )
def __str__(self) 。
return self.name
現在在我的管理界面中出現的方式是有一個名稱、屬性、價值和價格(為了清楚起見,只命名了相關欄位)。如果我添加一個這樣的產品。"t-shirt_1, size, sm, 17.98",那么我需要添加的下一個產品是 "t-shirt_1, size, med, 17.98",以此類推(2xl及以上,價格上升)。有沒有辦法簡化這個程序,我只需輸入一次產品名稱,然后添加所有尺寸和相關價格,以及產品內每個尺寸的庫存跟蹤(還沒有創建欄位)?
感謝您的指導
。uj5u.com熱心網友回復:
從Product模型中移除相應的屬性欄位,并在Product和ProductAttribute之間創建OneToMany關系。然后創建單獨的尺寸和顏色模型,并通過ManyToMany關系將它們與ProductAttribute聯系起來:
class Product(models.Model)。
category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True, blank=True)
name = models.CharField(max_length = 255, default=' ')
description = models.TextField(blank=True)
image = models.ImageField(upload_to='products/', null=True, blank=True)
slug = models.SlugField(max_length = 255, default=' '/span>)
price = models.DecimalField(max_digits=4, decimal_places=2)
has_attributes = models.BooleanField(default=False)
...
class ProductAttribute(models.Model)。
product = models.ForeignKey('Product', related_name="product_attrs", on_delete=models.CASCADE)
sizes = models.ManyToManyField('Size', related_name="product_sizes", null=True, blank=True)
colors = models.ManyToManyField('Product'/span>, related_name="product_colors", null=True, blank=True)
...
class Size(models.Model)。
size_num = models.CharField(max_length=10)
...
class Color(models.Model)。
color_name = models.CharField(max_length=15)
...
現在你可以創建Product物件,然后轉到ProductAttribute,將相應的產品物件與產品屬性模型聯系起來,并添加該產品的每個屬性(尺寸或顏色)。每當你需要獲得產品的尺寸或顏色時,你可以按以下方法來做:
# let's say you need to get sizes of last product.
p = Product.objects.last()
sizes = p.product_attrs.size.all()
# ↑ 回傳包含產品所有尺寸的queryset。
uj5u.com熱心網友回復:
不需要
class Attribute(models.Model)。
name = models.CharField(max_length = 255, default=' ')
def __str__(self):
return self.name
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/307455.html
標籤:
上一篇:在一個未初始化的實體變數上使用@synchronized是否安全?
下一篇:查詢Django中用戶的收藏夾
