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 ...
随机推荐
- Jimmychoo商城系统总结
一.需求 1.游戏模块 ①在进入H5之前,首先有一个动态的探照灯的动效,然后由"淡出"效果到H5首页. ②在点击"开始游戏"之后会有一段动画演示游戏内容,然后滑 ...
- IOS学习——iphone X的适配
说实话,对于一个刚入门iOS两个月的新手而言,在拿到这个任务的时候整个人都是懵逼的,怎么做适配?哪些地方需要适配?该怎么做?一个个问题搞得头都大了. 首先,啥都不管,先在iPhone X上运行起来看看 ...
- eclipse中删除多余的tomcat server
在eclipse菜单中选择Window--Show View--Server--Servers,打开这个服务窗口,将多余的服务删除即可. 如果每次启动中太卡没反应,那就是服务没选择好,或是端口冲突的原 ...
- Centos7.4下用Docker-Compose部署WordPress(续)-服务器端用Nginx作为反向代理并添加SSL证书(阿里云免费DV证书)
前言 在我写完Centos7.4下用Docker-Compose部署WordPress这篇文章后,我的个人博客已经正式的开始运作.但考虑到网站访问的安全性以及今后可能会重复利用服务器来部署其他网站的可 ...
- 淘宝联盟api调用笔记
一.流程及主要请求接口 每日凌晨1点开始,服务器定时自动请求淘宝联盟数据,请求完毕之后,执行一个存储过程对数据进行整理,删除过期...购买数量<...的商品......,请求接口分别有(tbk_ ...
- java中自动装箱带来的性能问题
之前没有特别注意自动封装所带来的性能问题,今天看了effective java,实验了一下,结果大吃一惊: 考虑下面这段代码: public static void main(String args[ ...
- 关于帧动画steps属性的理解
CSS3的Animation有八个属性 animation-name animation-duration animation-delay animation-iteration-count anim ...
- C#截取当前活动窗体的图片
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- markdown使用小结
初学时,对不太熟悉的markdown语法,有个简单记录 公式 公式一般用Latex书写,在线Latex编辑器可以使用,有以下几种方法供选择 有然后保存为图片gif格式,使用img标签进行引用. 使用G ...
- Oracle函数sys_connect_by_path 详解
Oracle函数sys_connect_by_path 详解 语法:Oracle函数:sys_connect_by_path 主要用于树查询(层次查询) 以及 多列转行.其语法一般为: s ...