多级视图的model的创建

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
下面是一个 DRF 实现多级嵌套数据的完整例子,展示了如何使用 Serializer 嵌套来实现多级嵌套数据的 API: models.py: ```python from django.db import models class Category(models.Model): name = models.CharField(max_length=50) def __str__(self): return self.name class Product(models.Model): name = models.CharField(max_length=50) price = models.DecimalField(max_digits=8, decimal_places=2) category = models.ForeignKey(Category, on_delete=models.CASCADE) def __str__(self): return self.name ``` serializers.py: ```python from rest_framework import serializers from .models import Category, Product class ProductSerializer(serializers.ModelSerializer): class Meta: model = Product fields = ('id', 'name', 'price') class CategorySerializer(serializers.ModelSerializer): products = ProductSerializer(many=True) class Meta: model = Category fields = ('id', 'name', 'products') ``` views.py: ```python from rest_framework import viewsets from .models import Category, Product from .serializers import CategorySerializer, ProductSerializer class ProductViewSet(viewsets.ModelViewSet): queryset = Product.objects.all() serializer_class = ProductSerializer class CategoryViewSet(viewsets.ModelViewSet): queryset = Category.objects.all() serializer_class = CategorySerializer ``` 在上面的例子中,Category 表示类别模型,其中包含了类别的名称,Product 表示产品模型,其中包含了产品的名称、价格和所属类别。在 ProductSerializer 中,表示产品的序列化器,只包含了产品的基本信息。在 CategorySerializer 中,表示类别的序列化器,通过 ProductSerializer 来嵌套表示产品的信息。在 CategoryViewSet 和 ProductViewSet 中,分别表示类别和产品的 API 视图集合,其中 CategoryViewSet 中的 queryset 包含了所有的类别,ProductViewSet 中的 queryset 包含了所有的产品。通过访问 /categories/ 可以获取所有的类别信息,包含了每个类别的所有产品信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值