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 ...
随机推荐
- FTP&samba 服务简单部署
第1章 FTP服务部署 在Linux下,我们应用最广泛的FTP服务程序是 vsftpd ( TCP端口:而NMB服务是负责解析用的,类似与DNS实现的功能,NMB可以把Linux系统共享的工作组名称与 ...
- Day1作业要求
Day1作业 作业需求 博客 模拟登录 三级菜单 博客地址 杨振伟Day1博客地址 模拟登录 1.程序说明 实现功能如下 用户输入密码,密码验证后登录成功 用户登录成功后提示登录信息 用户输入3次错误 ...
- AngularJS学习篇(十四)
AngularJS 事件 ng-click 指令 ng-click 指令定义了 AngularJS 点击事件. <!DOCTYPE html> <html> <head& ...
- css变量
CSS变量: 目前主流浏览器都已支持CSS变量,Edge 浏览器也支持 CSS 变量.用户可以方便地在css中使用自定义变量. <!DOCTYPE html> <html lang= ...
- 透过浏览器看HTTP缓存[转载]
http://www.admin10000.com/document/6299.html 作为前端开发人员,对于我们的站点或应用的缓存机制我们能做的似乎不多,但这些却是与我们关注的性能息息相关 ...
- URI 方法 encodeURI() encodeURIComponent() docodeURI() decodeURIComponent()
URI 方法 encodeURI() encodeURIComponent() docodeURI() decodeURIComponent() var sUri = “http://ww ...
- MSBuild Tools解决办法
每次在CI上通过Msbuild做发布,基本都会碰到下面的问题 error MSB4019: 未找到导入的项目"C:\Program Files (x86)\MSBuild\Microsoft ...
- selenium_Alert
网页测试,最避免不了的就是弹出框,但是弹出框你真的分的清吗? Alert prompt comfirm 先来认识一下这三个弹窗 代码如下 <!DOCTYPE html> <html ...
- oracle数据库管理系统常见的错误(二)
oracle数据库,对于新手来说总会遇到这样的问题: 相信大家都遇到了这样的问题,说实话,我曾经就遇到过这样的问题,但是不好意思问旁边的技术大咖,都有点怀疑人生了,然后自己在网上去查找原因,结果发现, ...
- MyEclipse10激活方法
背景:因为以前一直使用的是myeclipse8.6版本,但因为版本太低有些功能不支持,于是想试用下myeclipse10.0版本,但是下载后发现需要激活,但在激活的过程中遇到了很多坑,于是便有了本文的 ...