Django-网络商店模型组织

Django-网络商店模型组织,django,django-models,Django,Django Models,我开始在Django创建一个网络商店。它将有不同种类的产品,如衬衫、海报、马克杯、贴纸。每种类型的产品都有不同的字段。例如:衬衫有尺寸和颜色选择,贴纸有尺寸选择,海报和杯子没有选择 最好的方法是什么?遗产关系 我仍在学习Django,希望在我深入研究此类项目之前,从更有经验的人那里了解这一点 谢谢这是一个有趣的问题。我认为,首先您必须确定您的用户是否希望自己添加项目类型,或者是否有预定义的类型数量,并且只有开发人员可以在需要时添加新的类型 静态项目类型 如果项类型是静态的,则可以使用模型继承来创

我开始在Django创建一个网络商店。它将有不同种类的产品,如衬衫、海报、马克杯、贴纸。每种类型的产品都有不同的字段。例如:衬衫有尺寸和颜色选择,贴纸有尺寸选择,海报和杯子没有选择

最好的方法是什么?遗产关系

我仍在学习Django,希望在我深入研究此类项目之前,从更有经验的人那里了解这一点


谢谢这是一个有趣的问题。我认为,首先您必须确定您的用户是否希望自己添加项目类型,或者是否有预定义的类型数量,并且只有开发人员可以在需要时添加新的类型

静态项目类型

如果项类型是静态的,则可以使用模型继承来创建模式。因此,在本例中,我建议为每个项目类型定义一个或多个抽象基础模型和具体模型。例如,您可以这样做:

class Item(models.Model): slug = models.SlugField() price = models.DecimalField() remaining = models.IntegerField() description = models.CharField() class Meta: abstract=True class ClothingItem(Item): size = models.CharField() brand = models.CharField() class Meta: abstract=True class Jacket(ClothingItem): has_hood = models.BooleanField() class Hat(ClothingItem): hat_type = models.CharField(choices=[]) class Category(models.Model): name = models.CharField() class Attribute(models.Model): category = models.ForeignKey(Category) name = models.CharField class Item(models.Model): slug = models.SlugField() price = models.DecimalField() remaining = models.IntegerField() category = models.ForeignKey(Category) description = models.CharField() attributes = models.ManyToManyField(Attribute, through='ItemAttribute') class ItemAttribute(models.Model): item= models.ForeignKey(Item) attribute = models.ForeignKey(Attribute) value = models.CharField() 这个设计有点复杂。我们这里有一个类别模型,它将定义您的物品类型(帽子、夹克、马克杯、衬衫、海报等)——您还可以定义类别的层次结构,我将把它作为练习留给您。属性模型定义属性的名称——每个属性都有一个名称和它所属的类别。因此,对于夹克类别,您将具有has_hood属性,对于帽子类别,您将具有hat_type属性等

现在,项目模型也属于一个类别,并且通过项目属性模型与属性模型存在多对多关系。最后一个表示您将有一个 数据库中包含以下字段的ItemAttribute表:

item - attribute - value 项目-属性-值 因此,护套312将具有值为true的属性2(has_hood),而护套313将具有值为false等的属性2

上述设计有一个小问题,即属性中没有“类型”。您应该通过在属性模型中添加_类型属性来进一步扩展它另外,请检查此问题的答案: 以更通用的方式定义动态模型字段。

使用此设计,用户将能够创建新属性,将其分配到类别,以便在添加新项目时,能够根据其类别填充属性。当然,要使用户能够做到这一点,还必须生成包含每个项目的动态属性的动态表单。如果您愿意,我还可以告诉您如何做到这一点——这并不像最初有人认为的那样困难(提示:使用
type
生成动态表单类)