一。简介
-
<李> #组合搜索李>
<李> #技术方向:自动化,测试,运维,前端李>
<李> #分类:Python Linux JavaScript OpenStack节点。js去李>
<李> #级别:初级中级高级骨灰级李>
有4张表:
方向(技术方向标)、分类(技术分类表),水平(难度级别表)、视频(视频表)
它们的关系是:
方向与分类多对多关系
视频与分类、级别是一对多关系
最终要实现的结果如下图:
二。模型代码
类方向(models.Model): ”“” 技术方向:自动化,测试,运维,前端 ”“” name=模型。CharField (verbose_name='名称,max_length=32) 分类=models.ManyToManyField(分类) 类元: #重命名表名,不要自动添加的应用程序名 db_table=胺较颉? verbose_name_plural='方向(视频方向)” def __str__(自我): 返回self.name 类分类(models.Model): ”“” 分类:Python Linux JavaScript OpenStack节点。js去 ”“” name=模型。CharField (verbose_name='名称,max_length=32) 类元: db_table=胺掷唷? verbose_name_plural='分类(视频分类)的 def __str__(自我): 返回self.name 类级别(models.Model): title=models.CharField (max_length=32) 类元: db_table=八健? verbose_name_plural='难度级别” def __str__(自我): 返回self.title 类视频(models.Model): status_choice=( (1,'下线”), (2,'上线”), ) 状态=模型。IntegerField (verbose_name='状态”,选择=status_choice默认=1) 水平=models.ForeignKey(级别) 分类模型。ForeignKey(“分类”,零=True,空白=True) 重量=模型。IntegerField (verbose_name='权重(按从大到小排列)”,默认=0) title=模型。CharField (verbose_name='标题”,max_length=32) 摘要=模型。CharField (verbose_name='简介”,max_length=32) # img=模型。ImageField (verbose_name='图片”,upload_to=?静态/图像/视频/? img=模型。CharField (verbose_name='图片”,max_length=32) href=https://www.yisu.com/zixun/models.CharField (verbose_name='视频地址”,max_length=256) create_date=models.DateTimeField (auto_now_add=True) 类元: db_table='视频' verbose_name_plural='视频” def __str__(自我): 返回self.title
三。url路由代码
urlpattern=[ url (r ^ admin, admin.site.urls), #利用的是有名分组的方法,分别获取不同的id url (r ^视频(& # 63;术中;direction_id> (\ d +))((& # 63;术中;classification_id> (\ d +))((& # 63;术中;level_id> (\ d +))。html的美元,views.video name='视频') )
四。视图代码
def视频(请求、* args * * kwargs): 条件={} k、v kwargs.items (): temp=int (v) kwargs [k]=temp 打印(kwargs) #(& # 63;术中;direction_id> (\ d +))((& # 63;术中;classification_id> (\ d +))((& # 63;术中;level_id> (\ d +)) #构造查询字典 direction_id=kwargs.get (“direction_id”) classification_id=kwargs.get (“classification_id”) level_id=kwargs.get (“level_id”) #获取所有的技术方向 direction_list=models.Direction.objects.all () #当没有选择技术方向时,就获取所有分类 如果direction_id==0: class_list=models.Classification.objects.all () #当没有选择分类时,不做什么 如果classification_id==0: 通过 其他: #否则就将分类id放入字典 [' classification_id ']=classification_id条件 其他: #当选择了技术方向id时,查询出该技术方向下的所有分类 direction_obj=models.Direction.objects.filter (id=direction_id)当代() class_list=direction_obj.classification.all () #只获取该方向下的分类id vlist=direction_obj.classification.all () .values_list (id) #下面的代码为了生成条件是传入的一对多查询id,如:{“classification_id__in”: (1、2、3),“level_id”: 1} 如果不是vlist: classification_id_list=[] 其他: #将vlist转换成列的表 classification_id_list=列表(zip (* vlist)) [0] 如果classification_id==0: [' classification_id__in ']=classification_id_list条件 其他: 如果classification_id classification_id_list: [' classification_id ']=classification_id条件 其他: #指定技术方向:(1、2、3)分类:5 kwargs [' classification_id ')=0 [' classification_id__in ']=classification_id_list条件 如果level_id==0: 通过 其他: [' level_id ']=level_id条件 level_list=models.Level.objects.all () video_list=models.Video.objects.filter(* *条件) #技术方向的queryset对象列表 打印(direction_list) #分类的queryset对象列表 打印(class_list) #等级的queryset对象列表 打印(level_list) #视频的queryset对象列表 打印(video_list) #技术方向的id,分类的id,等级的id组成的字典 打印(kwargs) 返回渲染( 请求, “video.html”, { “direction_list”: direction_list, “class_list”: class_list, “level_list”: level_list, “video_list”: video_list, “kwargs”: kwargs, } )django组合搜索实现过程详解(附代码)