• Django之组合查询


    一 .Django组合查询

         很多电商网站中有组合搜索的功能,所谓组合搜索就是网页中组合多个条件,对数据库中进行查询,并且将结果显示在页面中,下面是所做组合查询效果图:

    实现代码如下:

    <1>设计数据库

    from django.db import models
    
    class Direction(models.Model):
        """
        方向:大数据,人工智能,web开发,系统运维,移动开发
        """
        name = models.CharField(verbose_name='名称', max_length=32)
    
        classification = models.ManyToManyField('Classification')
    
        class Meta:
            db_table = 'Direction'
            verbose_name_plural = '方向(视频方向)'
    
        def __str__(self):
            return self.name
    
    
    class Classification(models.Model):
        """
        分类:Python PHP.......
        """
        name = models.CharField(verbose_name='名称', max_length=32)
    
        class Meta:
            db_table = 'Classification'
            verbose_name_plural = '分类(视频分类)'
    
        def __str__(self):
            return self.name
    
    
    class Level(models.Model):
        title = models.CharField(max_length=32)
    
        class Meta:
            verbose_name_plural = '难度级别'
    
        def __str__(self):
            return self.title
    
    
    class Video(models.Model):
        status_choice = (
            (1, '下线'),
            (2, '上线'),
        )
    
        status = models.IntegerField(verbose_name='状态', choices=status_choice, default=1)
        level = models.ForeignKey(Level,on_delete=models.CASCADE)
        classification = models.ForeignKey('Classification', null=True, blank=True,on_delete=models.CASCADE)
    
        weight = models.IntegerField(verbose_name='权重(按从大到小排列)', default=0)
    
        title = models.CharField(verbose_name='标题', max_length=32)
        summary = models.CharField(verbose_name='简介', max_length=32)
        # img = models.ImageField(verbose_name='图片', upload_to='./static/images/Video/')
        img = models.CharField(verbose_name='图片',max_length=32)
        href = models.CharField(verbose_name='视频地址', max_length=256)
    
        create_date = models.DateTimeField(auto_now_add=True)
    
        class Meta:
            db_table = 'Video'
            verbose_name_plural = '视频'
    
        def __str__(self):
            return self.title
    modes.py

    <2>配置url

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
     
        url(r'^video2-(?P<direction_id>(d+))-(?P<classification_id>(d+))-(?P<level_id>(d+)).html$', views.video2),
    ]
    View Code

    <3>视图处理部分view.py

    from django.shortcuts import render
    from app01 import models
    
    def video2(request,*args,**kwargs):
        condition = {}#video查询字典
    
        for k, v in kwargs.items():
            temp = int(v)
            kwargs[k] = temp
        print('kwargs:',kwargs) # (?P<direction_id>(d+))-(?P<classification_id>(d+))-(?P<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()
    
        if direction_id == 0:#代表全部方向
            class_list = models.Classification.objects.all()
            if classification_id == 0:#代表全部课程分类
                pass
            else:
                condition['classification_id'] = classification_id
        else:
            direction_obj = models.Direction.objects.filter(id=direction_id).first()
            class_list = direction_obj.classification.all()#跨表查询所选方向下的所有课程分类
            print('class_list:',class_list)
    
            class_list_id = direction_obj.classification.all().values_list('id')
            if not class_list_id:
                classification_id_list = []
            else:
                classification_id_list = list(zip(*class_list_id))[0]
    
            if classification_id == 0:
                condition['classification_id__in'] = classification_id_list
            else:
                if classification_id in classification_id_list:#某课程分类在指定方向课程分类列表中
                    condition['classification_id'] = classification_id
                else:
                    # 某课程分类不在指定方向课程分类列表中
                    kwargs['classification_id'] = 0
                    condition['classification_id__in'] = classification_id_list
    
        if level_id == 0:
            pass
        else:
            condition['level_id'] = level_id
        print('condition:',condition)
    
        level_list = models.Level.objects.all()
    
        video_list = models.Video.objects.filter(**condition)
    
        return render(
            request,
            'video2.html',
            {
                'kwargs':kwargs,
                'direction_list':direction_list,
                'class_list':class_list,
                'level_list':level_list,
                'video_list':video_list
    
            }
        )
    View.py

    <4>页面显示部分

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .condition a{
                display: inline-block;
                padding: 5px 8px;
                border: 1px solid #dddddd;
                text-decoration: none;
            }
            .condition a.active{
                background-color: coral;
                color: white;
                text-decoration: none;
            }
        </style>
    </head>
    <body>
        <div class="condition">
            <h1>筛选</h1>
            <div>
                {% if kwargs.direction_id == 0 %}
                    <a class="active" href="/video2-0-{{ kwargs.classification_id }}-{{kwargs.level_id}}.html">全部</a>
                {% else %}
                    <a href="/video2-0-{{ kwargs.classification_id }}-{{kwargs.level_id}}.html">全部</a>
                {% endif %}
                {% for item in direction_list %}
                    {% if item.id == kwargs.direction_id %}
                        <a class="active" href="/video2-{{ item.id }}-{{ kwargs.classification_id }}-{{kwargs.level_id}}.html">{{ item.name }}</a>
                    {% else %}
                        <a href="/video2-{{ item.id }}-{{ kwargs.classification_id }}-{{kwargs.level_id}}.html">{{ item.name }}</a>
                    {% endif %}
                {% endfor %}
            </div>
            <div>
                {% if kwargs.classification_id == 0 %}
                    <a class="active" href="/video2-{{ kwargs.direction_id}}-0-{{kwargs.level_id}}.html">全部</a>
                {% else %}
                    <a  href="/video2-{{ kwargs.direction_id}}-0-{{kwargs.level_id}}.html">全部</a>
                {% endif %}
                {% for item in class_list %}
                    {% if item.id == kwargs.classification_id %}
                       <a class="active" href="/video2-{{ kwargs.direction_id }}-{{ item.id }}-{{kwargs.level_id }}.html">{{ item.name }}</a>
                    {% else %}
                       <a  href="/video2-{{ kwargs.direction_id }}-{{ item.id }}-{{kwargs.level_id }}.html">{{ item.name }}</a>
                    {% endif %}
                {% endfor %}
            </div>
            <div>
                {% if kwargs.level_id == 0 %}
                    <a class="active" href="/video2-{{ kwargs.direction_id}}-{{ kwargs.classification_id }}-0.html">全部</a>
                {% else %}
                     <a  href="/video2-{{ kwargs.direction_id}}-{{ kwargs.classification_id }}-0.html">全部</a>
                {% endif %}
                {% for item in level_list %}
                    {% if item.id == kwargs.level_id %}
                        <a class="active" href="/video2-{{ kwargs.direction_id }}-{{ kwargs.classification_id }}-{{ item.id }}.html">{{ item.title }}</a>
                    {% else %}
                        <a href="/video2-{{ kwargs.direction_id }}-{{ kwargs.classification_id }}-{{ item.id }}.html">{{ item.title }}</a>
                    {% endif %}
                {% endfor %}
            </div>
    
        </div>
        <div>
            <h1>结果</h1>
            {% for row in video_list %}
                <div>{{ row.title }}</div>
                <img src="{{ row.img }}">
            {% endfor %}
        </div>
    </body>
    </html>
    HTML

    >>>>>>>待续

  • 相关阅读:
    wide&deep模型演化
    ES6常用知识点小结
    json 的循环输出
    javascript闭包问题
    controller层中,参数的获取方式以及作用域的问题
    SSM整合开发
    Myself
    Hyperledger Fabric相关文件解析
    Fabric1.4源码解析:链码实例化过程
    Fabric1.4源码解析:Peer节点启动过程
  • 原文地址:https://www.cnblogs.com/wuxunyan/p/9242710.html
Copyright © 2020-2023  润新知