django组合搜索实现过程详解(附代码)

  

一。简介
  

  
      <李> #组合搜索李   <李> #技术方向:自动化,测试,运维,前端李   <李> #分类:Python Linux JavaScript OpenStack节点。js去李   <李> #级别:初级中级高级骨灰级李   
  

有4张表:
  

  

方向(技术方向标)、分类(技术分类表),水平(难度级别表)、视频(视频表)

  

它们的关系是:
  

  

方向与分类多对多关系
  

  

视频与分类、级别是一对多关系

  

最终要实现的结果如下图:

  

 django组合搜索实现过程详解(附代码)

  

二。模型代码
  

        类方向(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组合搜索实现过程详解(附代码)