实例化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进行处理就好了~~
浙公网安备 33010602011771号