django同时查询两张表的数据,合并检索对象返回
原始需求:
1、一篇文章内容分N个版块,每篇文章的版块数量不同。
2、有个文章搜索功能,需要同时搜索标题和内容。
实现思路:
1、由于每篇文章的内容版块数量不同,因此将每个文章的标题和内容分开存入2张表中。
模型: #标题和属性模型
class ArticleInfoModel(models.Model):
title = models.CharField(max_length=200)
summary = models.TextField(null=True)
author = models.ForeignKey(User, null=True)
create_time = models.DateTimeField(null=True) #文章内容模型
class ArticleContentModel(models.Model):
article = models.ForeignKey('ArticleInfoModel')
content = models.TextField()
section = models.ForeignKey('ArticleContentSectionModel')
create_time = models.DateTimeField(null=True)
逻辑实现:
def search_article(request,page=1,category_id=0):
try:
currentPage = int(page)
categoryId = int(category_id)
except:
pass if request.method == 'GET':
return json_result(message=u'搜索文章页面!')
else:
searchWord = request.POST.get('search_word',None) if searchWord:
try:
searchWord = str(searchWord).replace(' ','')
except:pass numPage = int(configs.PC_FRONT_NUM_PAGE)
start = (currentPage - 1) * numPage
end = start + numPage if categoryId:
methodCategoryModel = CategoryModel.objects.filter(pk=categoryId, is_active=1).first()
if methodCategoryModel:
# 先过滤出符合条件的文章信息,然后在这些文章中检索出和关键词相匹配的文章
indexModel = ArticleInfoModel.objects.filter(status__in=[1,2,3],category=methodCategoryModel).all()
else:
return json_params_error(message=u'你尝试查看一个不存在的分类下的文章!')
else:
indexModel = MethodArticleInfoModel.objects.filter(status__in=[1,2,3]).all() # 开始检索文章标题模型
infoModel = indexModel.filter(Q(title__icontains=searchWord) | Q(summary__icontains=searchWord)).all() # 再跨表检索文章内容模型中和关键词相匹配的文章内容,并且对article去重
contentModel = ArticleInfoModel.objects.filter(methodarticlecontentmodel__content__icontains=searchWord).distinct()
# 由于内容只进行关键词检索,没有对文章其他条件进行过滤,因此需要再次计算检索出的内容和其他条件的交集
tmp_content_list = set()
if contentModel:
content_list = set(contentModel)
index_list = set(indexModel)
tmp_content_list = content_list.intersection(index_list) #求内容模型和索引模型的交集 # 最后将符合条件的文章标题模型和文章内容模型合并返回
info_list = set()
if infoModel:
info_list = set(infoModel) # 在从文章标题模型中查找出最终汇总的模型返回
articleModel = info_list.union(tmp_content_list) else:
return json_params_error(message=u'请输入要搜索的关键词!') if len(articleModel) > 0:
...
正常操作数据模型
...else:
return json_params_error(message=u'暂无相关文章!')
这么做的缘由:
1、在django 1.10版本中,不支持在一个过滤条件中同时检索两张表,因此只能一张一张查询。
比如:
indexModel = ArticleInfoModel.objects.filter(
Q(title__icontains=searchWords)|
Q(summary__icontains=searchWords)|
Q(articlecontentmodel__content__icontains=searchWords) #这是ArticleContentModel 模型
status__in=[1,2,3],
category=methodCategoryModel).all()
在官方文档中提到,模型可以进行关联查询,如果没有关联关系的模型可以才用:模型名字小写__字段名字 来进行查询,
按照官方给的例子,单条过滤语句这样写没有任何问题,但是如果把这种跨表查询的语句和当前模型中需要过滤的条件写在一个过滤语句中进行查询,就拿不到想要的结果。
因此,就才用上面的方式,先过滤A表中的数据,然后跨表过滤B表中的数据。
之所以跨表过滤B表数据,是因为最终要将A,B表过滤的数据进行汇总。
由于在1.10以前版本中模型还不支持union()、intersection()这种交集、并集函数,这是在1.11版本中出的,mysql也不支持这种运算方式。
所以将A表中符合条件的模型集转换成set()类型,将B表中符合条件的模型集转换成set()类型,并计算出交集。
至此就可以实现同时检索两张表的问题。
django同时查询两张表的数据,合并检索对象返回的更多相关文章
- mysql左连接右连接(查询两张表不同的数据)
有两张表:一张A表he一张B表 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 :right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录: ...
- 关于跨DB增量(增、改)同步两张表的数据小技巧
有些场景下,需要隔离不同的DB,彼此DB之间不能互相访问,但实际的业务场景又需要从A DB访问B DB的情形,这时怎么办?我认为有如下常规的三种方案: 1.双方提供RESET API,需要访问不同DB ...
- hive sql 查询一张表的数据不在另一张表中
有时,我们需要对比两张表的数据,找到在其中一张表,不在另一张表中的数据 hql 如下: SELECT * FROM (SELECT id FROM a WHERE dt = '2019-03-17' ...
- 【第十五篇】easyui datagrid的列编辑,同时插入两张表的数据进去
看图说话. 需求:插入两张表,上面的表单是第一张表的内容,下面的两个表格是第二张详情表的内容,跟第一张表的id关联 第二张表有一个列是需要用户手动填写添加的. 国际惯例,上代码 <div id= ...
- SQL联合查询两个表的数据
刚有个项目,需要查询水位数据表中的水位信息,及查询降雨量表中统计时段降雨量的数据,以计算出日降雨量,而且时段是前一天8时到后一天8时总共24个小时. 两个子查询: 1.根据当前时间判断统计前天8时到今 ...
- 利用pymysql同时修改两张表的数据
使用pymysql操作数据库中相关联的两张表需求:两张表中分别有一个字段是json格式,需要往json中再插入一个属性值’container_cloud’=’fasle’. import pymysq ...
- php同时查询两个表的数据
业务环境,表一 会员等级表, 表二会员表, 有一个字段是相同的 会员等级ID level 在会员的显示页面要直接显示会员的会员等级名称,不是等级ID. 1.同时查询两个表 2.表设置别名, selec ...
- django(django学习) 两张表创建 插入数据
pycharm中直接创建django项目 输入创建项目名(如first_django) 在此输入应用名(如g_tu) 此为项目总目录 将first_django中settings.py中第58行修 ...
- SQL如何查询两个表的数据
在进行查询操作时,我们通常需要查询两个关联表的数据,我们可以使用where语句进行查询,如: select Emp.E_Id,Company.C_OraName from Emp,Company wh ...
随机推荐
- AngularJS学习篇(一)
AngularJS 使用 表达式 把数据绑定到 HTML. AngularJS 表达式 AngularJS 表达式写在双大括号内:{{ expression }}. AngularJS 表达式把数据绑 ...
- linux环境手动编译安装Nginx实践过程 附异常解决
1.下载nginx源码包并解压 可在http://nginx.org/en/download.html下载.tar.gz的源码包,如(nginx-1.4.7.tar.gz) 或者使用云盘下载 ht ...
- Pandas常用函数入门
一.Pandas Python Data Analysis Library或Pandas是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的.Pandas纳入了大量库和一些标准的数据模型, ...
- Akka(36): Http:Client-side-Api,Client-Connections
Akka-http的客户端Api应该是以HttpRequest操作为主轴的网上消息交换模式编程工具.我们知道:Akka-http是搭建在Akka-stream之上的.所以,Akka-http在客户端构 ...
- WIN7+wampserver2.4+zend stadio10.6.1配置Xdebug
一.前言 zend stadio调试很不方便,php5.3版本之前可使用zend debuger调试,php5.3以后就需要使用XDebug调试了.下面介绍我配置的经验,希望帮助更多的人 二.配置步骤 ...
- Android开发之漫漫长途 Ⅴ——Activity的显示之ViewRootImpl的PreMeasure、WindowLayout、EndMeasure、Layout、Draw
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- [转载] Redis实现分布式锁
转载自http://zhidao.baidu.com/link?url=m56mmWYwRgCymsaLZ2tx-GWDy5FYmUWGovEtuApjTpktHS3bhofrCS-QVGiLoWeS ...
- [转载] Lucene 工作原理
转载自http://www.cnblogs.com/dewin/archive/2009/11/24/1609905.html Lucene是一个高性能的java全文检索工具包,它使用的是倒排文件索引 ...
- jenkins~管道Pipeline的使用,再见jenkinsUI
Pipeline在Jenkins里的作用 最近一直在使用jenkins进行自动化部署的工作,开始觉得很爽,省去了很多重复的工作,它帮助我自动拉服务器的代码,自动还原包包,自动编译项目,自动发布项目,自 ...
- python学习笔记 tuple
1. ()去声明.与list类似,但是其元素不能改变. 2. 需要注意的是1中的不能改变是指()中的元素不能改变,如果其元素是一个list,那么list中的元素是可以改变的,不论是大小还是其他的. 3 ...