切记联系前文中简述的 数据表的关系
三级分类中的数据返回构造:
-
参照这个图片,看下面的数据结构:
-
这是一个难点,最主要的就是以一个好的形式将数据传递,使用
{
"1":{ # 这个数字key, 就是代表的 tb_channel_group 表当中的频道
"channels":[
# 这个就是一行,每个频道中包含的一级分类
{"id":1, "name":"手机", "url":"http://shouji.jd.com/"},
{"id":2, "name":"相机", "url":"http://www.itcast.cn/"}
],
"sub_cats":[
{
# 这是每个一级分类对应的二级分类
"id":38,
"name":"手机通讯",
"sub_cats":[
# 每个二级分类对应的三级分类信息
{"id":115, "name":"手机"},
{"id":116, "name":"游戏手机"}
]
},
{
"id":39,
"name":"手机配件",
"sub_cats":[
{"id":119, "name":"手机壳"},
{"id":120, "name":"贴膜"}
]
}
]
},
"2":{
"channels":[],
"sub_cats":[]
}
}
- 下面是具体实现的代码:
def get_categories():
# 查询分类数据,每个元素包含两个数据:一级分类列表。二级分类列表(里面含三级分类)
'''
categories={
1: {
channels:[{name:***, url:***}....], # 一级分类,某些一级分类属于同一频道
sub_cates:[sub{},....], # 二级分类,里面是三级分类
},
{}, {}, {}, .....
}
'''
# 1. 查询所有的频道
channel_list = GoodsChannel.objects.order_by('group_id', "sequence") # 前面一个排序是判断在一个频道,后面一个是判断,一个频道中 谁在前面,谁在后面排列
categories = {}
# 遍历频道,添加分类信息
for channel in channel_list:
# 判断频道是否已经存在
if channel.group_id not in categories:
# 不存在则新建频道
categories[channel.group_id] = {
'channels': [],
'sub_cats': []
}
# 添加一级分类, 二级分类
categories[channel.group_id]['channels'].append({'url': channel.url, 'name': channel.category.name})
# 添加二级分类:通过一级分类的对象关联找到对应的二级和三级分类
for sub2 in channel.category.subs.all():
# 这里的做法是后续的更改了。和上面的结构不一样, 直接是加入了一个 二级分类对象,它的一个属性含有三级分类对象,因为是前后端不分离开发,可以传递对象。
sub2.sub_cats = sub2.subs.all() # 获取二级分类对应的三级分类,动态给二级分类对象增加这个属性
categories[channel.group_id]['sub_cats'].append(sub2)
return categories
- 大致思路就是这样! 注释是那么的清晰~ 希望你能理解,不懂就要多看看上节的数据表分析。
首页广告展示:
直接上代码:这一部分逻辑要简单很多
def get(self, request):
# 2. 查询所有广告分类(广告位),我们之前讲的,广告分类,因为广告有很多投放位置
content_category_list = ContentCategory.objects.all()
# 构造广告字典
'''
{广告位标识:[广告1,....]}
'''
contents = {}
# 遍历广告分类,找到每个分类中需要展示的广告即可,这里也是不分离。 分离也很容易,把查出来的对象再次遍历,组成所需数据结构即可~
for content_category in content_category_list:
# 查询出一个广告位,对应的所有广告内容
contents[content_category.key] = content_category.content_set.all().order_by('sequence')
总结下来,实际上还是数据表的设计比较复杂。代码只要掌握一些技巧,知识构造数据结构。其实多写起来并不难。
over!