原始需求:

  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同时查询两张表的数据,合并检索对象返回的更多相关文章

  1. mysql左连接右连接(查询两张表不同的数据)

    有两张表:一张A表he一张B表 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 :right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录: ...

  2. 关于跨DB增量(增、改)同步两张表的数据小技巧

    有些场景下,需要隔离不同的DB,彼此DB之间不能互相访问,但实际的业务场景又需要从A DB访问B DB的情形,这时怎么办?我认为有如下常规的三种方案: 1.双方提供RESET API,需要访问不同DB ...

  3. hive sql 查询一张表的数据不在另一张表中

    有时,我们需要对比两张表的数据,找到在其中一张表,不在另一张表中的数据 hql 如下: SELECT * FROM (SELECT id FROM a WHERE dt = '2019-03-17' ...

  4. 【第十五篇】easyui datagrid的列编辑,同时插入两张表的数据进去

    看图说话. 需求:插入两张表,上面的表单是第一张表的内容,下面的两个表格是第二张详情表的内容,跟第一张表的id关联 第二张表有一个列是需要用户手动填写添加的. 国际惯例,上代码 <div id= ...

  5. SQL联合查询两个表的数据

    刚有个项目,需要查询水位数据表中的水位信息,及查询降雨量表中统计时段降雨量的数据,以计算出日降雨量,而且时段是前一天8时到后一天8时总共24个小时. 两个子查询: 1.根据当前时间判断统计前天8时到今 ...

  6. 利用pymysql同时修改两张表的数据

    使用pymysql操作数据库中相关联的两张表需求:两张表中分别有一个字段是json格式,需要往json中再插入一个属性值’container_cloud’=’fasle’. import pymysq ...

  7. php同时查询两个表的数据

    业务环境,表一 会员等级表, 表二会员表, 有一个字段是相同的 会员等级ID level 在会员的显示页面要直接显示会员的会员等级名称,不是等级ID. 1.同时查询两个表 2.表设置别名, selec ...

  8. django(django学习) 两张表创建 插入数据

      pycharm中直接创建django项目 输入创建项目名(如first_django) 在此输入应用名(如g_tu) 此为项目总目录 将first_django中settings.py中第58行修 ...

  9. SQL如何查询两个表的数据

    在进行查询操作时,我们通常需要查询两个关联表的数据,我们可以使用where语句进行查询,如: select Emp.E_Id,Company.C_OraName from Emp,Company wh ...

随机推荐

  1. 流式计算storm,spark文章

    使用Storm实现实时大数据分析!http://www.csdn.net/article/2012-12-24/2813117-storm-realtime-big-data-analysis     ...

  2. easyui dialog 中嵌入html页面

    最近使用easyui比较多,这个插件确实很好用.在使用时也遇到了大大小小的问题,好在都一一解决了. 记录一下今天遇到的问题. 目的:用easyui的dialog嵌入一个html页面(html中仍有要执 ...

  3. 利用JavaScript实现动态显示表格且对应改变按键的value值

    插入的代码并没有符合HTML5样式,只是为了实现利用JS动态显示表格,并且按键的value值会同时发生变化的功能. <!DOCTYPE > <html > <head&g ...

  4. Linux修改时区的正确方法

    CentOS和Ubuntu的时区文件是/etc/localtime,但是在CentOS7以后localtime以及变成了一个链接文件 [root@centos7 ~]# ll /etc/localti ...

  5. [置顶]【实用 .NET Core开发系列】- 导航篇

    前言 此系列从出发点来看,是 上个系列的续篇, 上个系列因为后面工作的原因,后面几篇没有写完,后来.NET Core出来之后,注意力就转移到了.NET Core上,所以再也就没有继续下去,此是原因之一 ...

  6. Linux学习决心书

    学习Linux决心计划书 我叫耿长学,来自河南省邓州市,经过老男孩教育运维班5个月学习后,我一定要达到的薪水目标是11000元,为了达到此目标我将采取如下10大行动或方案: 1.每天早上5:30-6: ...

  7. 使用qt制作一个简单的计算器

    前言:今天使用qt制作了一个很简单的计算器,觉得挺有意思的,所以在这里跟大家分享一下. 这里先跟大家说说使用到的函数: 一.槽连接函数 connect(信号发送者,发送的信号,信号接收者,信号接收者的 ...

  8. 通讯框架 t-io 学习——websocket 部分源码解析

    前言 前端时间看了看t-io的websocket部分源码,于是抽时间看了看websocket的握手和他的通讯机制.本篇只是简单记录一下websocket握手部分. WebSocket握手 好多人都用过 ...

  9. C#中抽象类与接口的区别

    1.面向接口编程和面向对象编程是什么关系 首先,面向接口编程和面向对象编程并不是平级的,它并不是比面向对象编程更先进的一种独立的编程思想,而是附属于面向对象思想体系,属于其一部分.或者说,它是面向对象 ...

  10. Vue浅谈

    谈Vue 最近在学习Vue相关的知识点并且也做一些练手,就在学习过程中出现的各种坑爹的地方做一个总结!之后再遇到也不会抓瞎. 1.Vue工程的安装 (1)首先先安装node.js这是Vue的运行基础. ...