今天在本地很快实现了最新评论的功能。在右手边的最新评论点击连接时会去到文章的页面,并定位到评论所在的锚点上,也就是说,我需要在页面上取得评 论所在文章的ID,也就是需要这样:{{comment.comment_to.id}}。这时候,我仅仅需要获得文章的ID,但不知道Django是否 会到数据库去把相应的文章查出来(我没有使用Select_relate)之后再拿ID呢?不过Django好现没有可以设置打印执行Sql语句的开关, 并不能通过配置来看到运行时Django查了多少次数据库。而这样的功能,我使用Java的Hibernate时就有的。
我Google了一下,发现Django本身是没有提供日志和Sql打印功能的。而有人做了些工作,如这位仁兄写了个中间件,可以在页面上打印出该次请求一共执行了多少条语句,每条语句的执行时间。而这里有个叫Django-logging的项目,为Django提供Logging,包括Sql的打印。等会就试验一下。Django天生就是Lazyload的,需要用到数据的时候才去加载,我希望,我的担心是多余的。一会尝试使用Log来看看测试结果吧。
结果一:Select_related对允许为空的外键不起作用。
我的查询语句是这样:entries = blog.entry_set.filter(status=1).select_related(depth=1).order_by('-id') 查询一个Blog下面所有的Entry,并把有关联的数据一并抓取出来(根据ForeignKey)。也就是说,在查询Entry的同时查出Blog,作 者,分类等信息。
但是情况是,我在页面找印这些文章的时候,需要把文章的分类也打显示出来,这时候,Django却跑到数据库执行了N次查询分类的语句。暴汗。这是经典的 Hibernate的延迟加载用得不恰当的情况啊!我一看打印出来的查询语句,有查相关的作者、Blog,但偏偏没有查分类。最后我回到Model里比较 了一下,我的分类属性上面设置了null=true,原意是让文章可以没有分类。最后我尝试着去掉Null=true,一运行。那N条查询不见了。靠。。原来Select_related在外键允许空的情况下是行不通D。
结果二:Django不会智能LazyLoad。要手动去Select_related。
回到对Django有疑问的情景,recent_comments = Comment.objects.filter(blog=blog).order_by('-comment_time')[:10] 查出本BLog最新的十条评论。我的假设是,Comment本身保存有Entry的ID,所以在仅仅是获取Entry的ID的时候不需要去数据据里找, Hibernate的LazyLoad就是这样做的,使用动态代理的解决方案。我想在Python这样的动态语言的解决方案更佳,但事实证明我错了。上面 的语句又产生了经典的1+N的问题。我在页面根据评论取EntryID的时候{{comment.entry.id}}还是去加载了一次数据,搞笑的是, 这句查询需要得到的数据对我有用的是ID,但是查询条件就是ID。我只好把查询语句改成:
recent_comments = Comment.objects.select_related(depth=1).filter(blog=blog).order_by('-comment_time') [:10]。显示去Select_related。宁愿直接去Join相关的表,也不要做1+ N的查询。显然这很浪费,仅仅为了一个ID,要Join好几个表。
原文在这里
分享到:
相关推荐
基于Django框架的智能点餐系统源码+数据库,作为毕业设计,课程设计,期末大作业都可以,绝对高分项目。 基于Django框架的智能点餐系统源码+数据库,作为毕业设计,课程设计,期末大作业都可以,绝对高分项目。基于...
基于Django的智能人脸识别监控系统,项目文件完整,配置好环境即可运行。 可用做python毕业设计,基于人脸识别的智能监控,致力于打造一个面向有小规模监控需求的用户的,低成本的,智能识别监控系统。 基于Django...
基于Django的智能教室管理系统源码+数据库(python毕业设计)。已获高分通过项目。项目简介 本项目是一套基于Django的智能教室管理系统,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的python学习者...
python项目基于django的智能旅游推荐系统的实现.zippython项目基于django的智能旅游推荐系统的实现.zippython项目基于django的智能旅游推荐系统的实现.zippython项目基于django的智能旅游推荐系统的实现.zippython...
【资源说明】基于Python和Django开发的智能图片分类平台源码+数据集+模型.zip基于Python和Django开发的智能图片分类平台源码+数据集+模型.zip基于Python和Django开发的智能图片分类平台源码+数据集+模型.zip基于...
基于Django开发的智能分类图片平台源码(含客户端)+sql数据库+模型文件.zip基于Django开发的智能分类图片平台源码(含客户端)+sql数据库+模型文件.zip基于Django开发的智能分类图片平台源码(含客户端)+sql数据库+模型...
基于Django的face recognition 智能人脸识别监控系统毕业设计源码,项目文件完整,只要配置好环境即可运行(Windows 10 21h2),介绍:毕业设计,基于人脸识别的智能监控,致力于打造一个面向有规模监控需求的用户的,...
基于Python + Django 搭建的智能预约点餐系统,同时使用了QQOAuth系列API让其更加的易用。1,完成了搜索结果的渲染。 2,与前端合作完成了个人中心的美化。 3,新增了评论收藏表字段用来开展二期的工程。4,使用第三...
基于python+django的语音识别的智能垃圾分类系统的实现.zip基于python+django的语音识别的智能垃圾分类系统的实现.zip基于python+django的语音识别的智能垃圾分类系统的实现.zip 采用python开发,django网页框架,...
基于Django和智能算法的高考志愿填报推荐系统源码+项目说明.zip基于Django和智能算法的高考志愿填报推荐系统源码+项目说明.zip基于Django和智能算法的高考志愿填报推荐系统源码+项目说明.zip基于Django和智能算法的...
3. 基于Python Django的智能家居系统设计方法:文档着重介绍了使用Python Django技术栈来构建智能家居系统的主控系统和网关系统的设计方法。Python Django作为一个高性能的Web框架,能够通过简洁的编程方式提供快速...
《人工智能 Django 练习手册》是一本针对初学者的指南,涵盖了Django框架的基础知识和实践操作。Django是一款强大的Python Web开发框架,以其高效、安全和可扩展性著称。 1. Django简介与安装: Django是基于MTV...
毕业设计项目-使用django框架搭建微博智能分析系统,已获通过的高分项目。 毕业设计项目-使用django框架搭建微博智能分析系统,已获通过的高分项目。毕业设计项目-使用django框架搭建微博智能分析系统,已获通过的...
在Python的Web开发框架Django中,实现应用的多语言支持是通过其强大的国际化(Internationalization,简称i18n)功能来完成的。这里主要介绍两种关键工具:gettext和Poedit,它们在Django国际化过程中起着至关重要的...
这是一个基于Django框架的人工智能服务接口设计,使用Python语言开发,包含22个文件。主要文件类型包括11个Python源文件、4个Python字节码文件、3个PNG图片文件、1个gitignore文件、1个SQLite3文件、1个Markdown文...
Django 文档¶ 你所需要知道的关于 Django 的一切。 快速入门¶ 你是刚学 Django 或是初学编程? 这就是你开始学习的地方! 从零开始: 概要 | 安装 入门教程: 第 1 节:请求和响应 | 第 2 节:模型和管理站点 | ...
基于Python+django的智能人脸识别监控系统源码+文档说明(毕业设计)基于Python+django的智能人脸识别监控系统源码+文档说明(毕业设计)基于Python+django的智能人脸识别监控系统源码+文档说明(毕业设计)基于...
django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django电子商务网站源码 django...
Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django实现商城网站源码 Django...