实例化Q查询对象——当查询的字段与条件是变量的时候用到

表关系是这样的

 跟进记录表~跟咨询的客户是多对一;跟跟进人(销售用户)是多对一——做了外键关联。

#跟进记录表
class ConsultRecord(models.Model):
    status = models.CharField('跟进状态',max_length=8,choices=seek_status_choices,help_text='选择客户此时的状态')
    # 加了auto_now_add的话,用ModelForm添加的时候不用写这个了!自动会添加到当前的日期
    date = models.DateTimeField('跟进日期',auto_now_add=True)
    note = models.TextField('跟进内容')
    delete_status = models.BooleanField('删除状态',default=False)

    # 所咨询客户 跟客户表是多对一的关系
    customer = models.ForeignKey('Customer', verbose_name='所咨询客户', on_delete=models.CASCADE)
    #跟进人 跟用户表是多对一的关系
    consultant = models.ForeignKey('UserInfo',verbose_name='跟进人',related_name='records',on_delete=models.CASCADE)

想实现的效果是这样的

实现知网的效果,可以选择搜索条件是跟进人还是所咨询的客户——搜索内容自己写~

前端

{# 默认往当前页面提交 #}
                        <form action="" method="get" class="pull-right" style="width: 400px;display: inline-block">
                            <select name="condition" id="" class="form-control"
                                    style="width: 120px;display: inline-block">
                                <option value="consultant">跟进人</option>
                                <option value="customer">所咨询客户</option>
                            </select>
                            <input type="text" name="wd" class="form-control"
                                   style="width: 200px;display: inline-block">
                            <button class="btn btn-default">搜索</button>
                        </form>

前端form表单里面用select标签实现——注意,后台根据select标签的name属性取option的value值!

视图函数

视图函数的get方法如下:注意条件前的字段是需要按照ORM语法拼接的~~因为这里查询是需要跨表的~所以按照ORM语法拼接会复杂一点!

        condition = request.GET.get('condition', default='')
        wd = request.GET.get('wd', default='')
        # 模糊匹配的,因此这里将条件字段拼接成模糊匹配的形式
        if condition == 'consultant':
            condition = 'consultant' + '__username' + '__contains'
        elif condition == 'customer':
            condition = 'customer' + '__name' + '__contains'
        print(condition, wd)
        current_page_num = request.GET.get('page', default=1)
        # wd有值 说明进行了搜索操作!
        if wd:
            # 实例化一个Q查询类的对象
            q = Q()
            # 指定多条件连接符号,默认是and的关系,新加一个consultant=request.user,只看自己的
            q.connector = 'and'
            # 往q中添加条件~可以添加多个,默认是and的关系
            # 注意以元组的形式添加进去!
            q.children.append((condition, wd))  # 弄成这种形式:condition=qq&wd=1&page=2
            # 当前销售
            q.children.append(('consultant',request.user))
            # 删除状态为False
            q.children.append(('delete_status',False))

            # q.children.append(('qq_name__contains', '小')) # 还可以额外加一些固定的条件
            # all_customers = models.Customer.objects.filter(name__contains=wd)
            # 这样可以用q来筛选了~
            records = models.ConsultRecord.objects.filter(q)

然后拿到筛选后的结果records进行处理就好了~~

 

posted on 2019-06-17 06:44  江湖乄夜雨  阅读(349)  评论(0)    收藏  举报