原始需求:

  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. HDU 1892 See you~(二维树状数组)

    See you~ Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Su ...

  2. 配置好postfix邮件服务器之后就可以使用它来发送邮件了

    下面是一段摘自W3school关于php mail函数的栗子,经过测试发现两个问题. <?php $to = "somebody@example.com, somebodyelse@e ...

  3. HTTP响应头信息(Response Headers)与请求头信息(Request Headers)

    打开了电影天堂网站,我们鼠标右键“检查”->打开“开发者工具”->选择“Network”. 刷新网页,选择某一文件点击(此处我是点击db.css),可以观察到Response Header ...

  4. java 数据分页

    分页逻辑 import lombok.Data; /** * User eric * Date * Email yq@aso.ren */ @Data public class PageHelper ...

  5. maven下的sqlserver配置jar包

    看了两天的maven,开始把之前做的ssm项目搭建成maven项目,结果在sqlserver的依赖包上受阻,sqlserver需要sqljdbc4.jar包,经过一系列百度教程才得以解决,现在总结一下 ...

  6. 如何在工程中使用axis2部署webservice

    有一个最简单的方法就是把axis2.war中的内容作为Web Project的基础, 来进行开发. 不过为了更清楚的了解如何在一个已有的Web Project中嵌入axis2, 那就手动来配置.大致分 ...

  7. httpwebrequest 用GET方法时报无法发送具有此谓词类型的内容正文

    如下一段小程序,运行结果报无法发送具有此谓词类型的内容正文的错误,其实原因很简单,因为用的是GET的方式进行提交,而GetRequestStream()是用来在post提交的时候写post的内容的流, ...

  8. Python之程序执行时间计算

    import datetime starttime = datetime.datetime.now() #long running endtime = datetime.datetime.now() ...

  9. web-故道白云&Clound的错误

    web-故道白云 题目: 解题思路: 0x01 首先看到题目说html里有秘密,就看了下源代码如图, 重点在红圈那里,表示输入的变量是id,当然上一行的method="get"同时 ...

  10. socket.io 入门篇(二)

    本文原文地址:https://www.limitcode.com/detail/5922f1ccb1d4fe074099d9cd.html 前言 上篇我们介绍了 socket.io 基本使用方法,本篇 ...