1. 电商类别表的项目功能需求
1.1 需求分析
- 如图所示,天猫、京东,以及目前国内的一线电商平台,大多都是以这种结构作为首页上方的分类导航界面,将树状分类导航与轮播图镶嵌在一起,这样从网页设计角度上来讲,可以用最少的空间呈现最多的数据信息
- 可以将上图与天猫或者京东的首页进行对比查看。在轮播图上方是一级类目,包括商品分类及一些业务分类。当我们将光标悬浮在任何一个二级类目上时,就会出现在此二级类目下的三级类目、二级类目所包含领域的一些推荐品牌的Logo,以及在三级类目中比较热门的一些四级类目的搜索内容。
- 总结一下,类别表的设计需求如下:
- 类别表必须包含多级类目,至少分为四级类目。
- 类别表每一级类目数据都要有各自类目级别的标注,以便前端进行网页设计。
- 类别表内的类别数据,必须可以灵活地进行增、减,并且不会因此而改变其上下层级的数据关系
2. 传统表建立
class Type1(models.Model):
'''一级类目'''
name = models.CharField(max_length=32, verbose_name="类目名", default="")
add_time = models.DateTimeField(auto_now=True, verbose_name="添加时间")
class Meta:
db_table = "type1"
verbose_name = "商品类别"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Type2(models.Model):
'''二级类目'''
parent = models.ForeignKey(Type1, on_delete=models.CASCADE, null=True, blank=True)
name = models.CharField(max_length=32, verbose_name="类目名", default="")
add_time = models.DateTimeField(auto_now=True, verbose_name="添加时间")
class Meta:
db_table = "type2"
verbose_name = "二级商品类别"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Type3(models.Model):
'''三级类目'''
parent = models.ForeignKey(Type2, on_delete=models.CASCADE, null=True, blank=True)
name = models.CharField(max_length=32, verbose_name="类目名", default="")
add_time = models.DateTimeField(auto_now=True, verbose_name="添加时间")
class Meta:
db_table = "type3"
verbose_name = "三级商品类别"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Type4(models.Model):
'''四级类目'''
parent = models.ForeignKey(Type3, on_delete=models.CASCADE, null=True, blank=True)
name = models.CharField(max_length=32, verbose_name="类目名", default="")
add_time = models.DateTimeField(auto_now=True, verbose_name="添加时间")
class Meta:
db_table = "type4"
verbose_name = "四级商品类别"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
2.1 为什么不用传统表建类别表
- 不难看出,为了获取类别表数据,前端通过不同的4个API发送了4次网络请求,这是因为我们假设一个电商平台只有四级类目。但是现实中这显然是不可能的,往往一个用户量越庞大的电商平台,商品的种类越齐全、越细分,就意味着发送网络请求的倍数也就越多,需要的带宽也就更多,这个成本是非常庞大的。抛去带宽成本不谈,假如恰巧你的老板不在乎钱,不懂技术,又很好骗,但是前端工程师也会在开发获取类别数据时,因不得不开发冗长的代码而投诉后端工程师。所以,不要抱有侥幸心理,传统的建表方式构建大型电商平台的类别表是行不通的。
3. 使用Django的model实现类别表建立
3.1 四表和一
class Type(models.Model):
CATEGORY_TYPE = (
(1, "一级类目"),
(2, "二级类目"),
(3, "三级类目"),
(4, "四级类目"),
)
name = models.CharField(max_length=32, verbose_name="类目名", default="", help_text="类目名")
code = models.CharField(max_length=32, verbose_name="类别code", default="", help_text="类别code")
desc = models.CharField(max_length=32, verbose_name="类别描述", default="", help_text="类别描述")
category_type = models.IntegerField(choices=CATEGORY_TYPE, verbose_name="类别描述", help_text="类别描述")
parent_category = models.ForeignKey("self", null=True, blank=True, verbose_name="父类目录", related_name="sub_cat",
help_text="父类别", on_delete=models.CASCADE)
is_tab = models.BooleanField(default=0, verbose_name="是否导航", help_text="是否导航")
class Meta:
db_table = "type"
verbose_name = "商品类别"
verbose_name_plural = verbose_name
def __str__(self):
return self.name