gpt4 book ai didi

Django - 网上商店模型组织

转载 作者:行者123 更新时间:2023-12-04 04:44:46 26 4
gpt4 key购买 nike

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

做到这一点的最佳方法是什么?继承?关系?

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

谢谢

最佳答案

这是一个有趣的问题。我相信首先你必须弄清楚你的用户是否想要自己添加项目类型,或者是否有预定义的类型,如果需要,只有开发人员可以添加新的类型。

静态项目类型

如果项目类型是静态的,您可以使用模型继承来创建架构。因此,在这种情况下,我建议为每个项目类型定义一个或多个抽象基本模型和具体模型。例如,你会做这样的事情:

类项目(模型。模型):
弹头=models.SlugField()
价格=models.DecimalField()
剩余 = models.IntegerField()
描述 = 模型.CharField()

元类:
抽象=真

类服装项目(项目):
大小 = 模型.CharField()
品牌 = 模型.CharField()

元类:
抽象=真

类夹克(服装项目):
has_hood = models.BooleanField()

类帽子(服装项目):
hat_type = models.CharField(choices=[])

因此,上面的代码实际上只会生成两个数据库表:Jacket 和 Hat,每个表都包含它继承的模型中的所有字段。这是大多数人在 django 中使用的,因为它非常干净使得添加表单和生成查询以获取项目变得非常容易。

您的另一个选择是不使用抽象基类,因此您将获得一个名为 Item 的数据库表。其中将包含每个字段,另一个名为 ClothingItem 的表将包含 Item 的外键另一个名为 Jacket将包含 ClothingItem 的外键.这将帮助您在 Item 上生成聚合。或 ClothingItem ,但是每当您想要获取 Jacket 的属性时,django 都必须查询三个表(带连接)。我建议仅在您确定需要它时才使用它。

动态项目类型
在这种情况下,您必须使用不同的架构,因为项目的属性必须由应用程序的用户定义。你可以这样做:

类类别(模型。模型):
名称 = 模型.CharField()

类属性(模型。模型):
category = models.ForeignKey(Category)
名称 = 模型.CharField

类项目(模型。模型):
弹头=models.SlugField()
价格=models.DecimalField()
剩余 = models.IntegerField()
category = models.ForeignKey(Category)
描述 = 模型.CharField()
属性 = models.ManyToManyField(Attribute, through='ItemAttribute')

类 ItemAttribute(models.Model):
item=models.ForeignKey(Item)
属性=models.ForeignKey(属性)
值 = 模型.CharField()

这个设计有点复杂。我们这里有一个类别模型,它将定义您的项目类型(帽子、夹克、杯子、衬衫、海报等)——您还可以定义一个类别的层次结构,我将留给您作为练习。属性模型定义了属性的名称——每个属性都有一个名称和它所属的类别。因此,对于夹克类别,您将有一个 has_hood 属性,对于帽子类别,您将有一个 hat_type 属性等。

现在,一个 Item 模型也属于一个 Category 并且通过 ItemAttribute 模型与 Attribute 模型具有多对多关系。最后一个意味着你将有一个
具有以下字段的数据库中的 ItemAttribute 表:

项目 - 属性 - 值

因此,夹克 312 将具有值为 true 的属性 2(has_hood),而夹克 313 将具有值为 false 等的属性 2。

上面的设计有一个小问题,属性中没有“类型”。您应该通过向 Attribute 模型添加 _type 属性来进一步扩展它。 另外,请检查这个问题的答案:
Django dynamic model fields它以更通用的方式定义动态模型字段。


通过这种设计,您的用户将能够创建新属性,将它们分配到类别,因此当他们添加新项目时,他们将能够根据类别填充他们的属性。当然,要使您的用户能够执行此操作,您还必须生成包含每个项目的动态属性的动态表单。如果你愿意,我也可以告诉你怎么做——这并不像人们一开始认为的那么困难(提示:使用 type 生成动态表单类)。

关于Django - 网上商店模型组织,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18369556/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com