使用Django ' select_related '来提高网站性能
Django框架概述
Django是一个用于web后端开发的模型-视图-控制器框架。betwayapp下载安装在所有你能用Django做的事情中在后台,人脸识别,照片分享,列表中的跟随者/人群分享,甚至报税都是后台繁重应用的很好的例子。
显然,网络应用程序是大多数智能手机应用程序的核心,超越了浮华和耀眼,来设计一个好的网站,在保证用户数据安全的同时,提供跨平台无缝的用户体验。
Django是一个全栈的web应用框架,允许你构建市场Web页面、应用程序逻辑到驱动智能手机应用程序和桌面应用程序。
在这篇博文中,你将会读到一个web应用程序,在这个上下文中,我们将讨论数据模型表示和' select_related '查询。你可能也想阅读我们的其他博客文章学习Django。
图书馆民意测验Web应用程序
考虑这种情况;你当地的图书馆要求你开发一个调查网络应用程序,以便每月追踪最受欢迎的作家和书籍。我们将在这个web应用程序的上下文中讨论Django中与select_相关的查询缓存。
您有以下申请条件,
开发一个web表单与链接电子邮件给图书馆成员
Form允许他们最多选择3个作者,每个人选择3本书。
电子邮件URL确保一次投票。
在每个月末,您可以统计这个数据,并在图书馆的首页上发布信息
最后,您必须交付带有单元测试的源代码遵循web应用程序的标准测试实践。
设置Django
如果您对Django有点熟悉,并且已经启动并运行了它,请跳过本节和下一节。
通常你可以在你的Linux机器上为web应用程序开发设置Django框架,输入:betwayapp下载安装
安装django
成功安装后,应该启用以下命令:
django-admin.py美元
或者从python解释器中导入Django模块,
$ python >>> import django >>>“1.6.1”
并检查这些命令是否正确执行,版本号是否与您的安装相匹配。
你还需要安装Apache web服务器,MySQL或SQLite作为数据库后端,你可以开始使用Django。阅读更多安装部分django项目。
Django项目
下面的Django文档将帮助你了解Django的各个方面;但我强烈推荐您获得一些帮助!
虽然我们不讨论以下任何问题,但在这篇博文中,有一些建议
创建应用程序
使用上面的引用创建一个项目并设置一个SQLite数据库连接。然后在你的项目中你可以设置一个应用程序,
通过输入命令来设置一个名为' library_poll '的应用程序 |
$ django-admin .py startapp library_poll |
Django模型
对于我们的应用程序库,我们可以创建如下模型,在别处详细描述,在Django应用程序的library_poll/models.py文件中
库应用程序- Django模型 |
从django.db导入模型类民意调查(模型。模型):问题=模型。CharField (max_length=200) #输入pub_date=模型。DateTimeField (“发布日期”,要求= False)类AuthorChoice(模型。模型):民意调查=模型。ForeignKey(调查)author_name=模型。CharField (max_length=200)票=模型。IntegerField(默认=0)类BookChoice(模型。模型):民意调查=模型。ForeignKey(调查)作者= models.ForeignKey (AuthorChoice)book_name=模型。CharField (max_length=200)票=模型。IntegerField(默认=0) |
模型背后的逻辑是有一本书和作者模型为各自的支持率投票;在那里你将使用Poll对象来问问题,比如,
你最喜欢的作家是谁
你最喜欢的书是哪一本?
然后,因为一本书取决于作者,所以除了Polls之外,我们还有一个额外的外键用于BookChoice模型。
这个外键映射的设计使我们不仅可以询问最受欢迎的书籍,还可以询问作者在不同书籍中的总体受欢迎程度。简单地说,这就像是在问“即使”了女孩,吉莉安·弗林的作品,是当月最受欢迎的书饥饿游戏最受欢迎的作家可能是苏珊娜·柯林斯,而不是弗林。这是因为他们所有作品的作者获得的总票数可能超过单本书作者的票数。这说明作者受欢迎程度的投票并不等于书受欢迎程度的投票。
注意,我们不能简单地问作者写了什么书,因为我们在Authors中没有图书的外键关系,它只指向一个方向——即问这本书的作者是谁。
对象关系映射器(ORM)
Python自动创建数据库操作包装器,用于为上一节中创建的模型插入、查询和删除对象和表。您可以运行以下命令来生成对象关系映射,
生成ORM映射 |
$ python manage.py syncdb |
然后通过输入和填充你的作者和图书数据库来登录Django-Python shell。
生成ORM映射
$ python manage.py shell
从library_poll > > >。模型import Poll, AuthorChoice, BookChoice #ORM >>> author_poll = Poll(question='who is your favorite author?') >>> book_poll = Poll(question='what is your favorite book?') >>> author_poll.save() #demo the ORM capability with database >>> book_poll.save() >>> suze = AuthorChoice(poll=author_poll,author_name='Suze Collins') >>> suze.save() >>> >>>hunger_games = BookChoice(poll=book_poll,book_name='The Hunger Games 1',author=suze) >>> hunger_games.save()
请注意代码片段上的注释,这些注释演示了ORM的使用。
访问外键
一旦你设置好了模型,你就可以从django shell访问SQLite数据库并通过每个模型内建的QuerySet django API查询模型。
但是,要检索例如,写这本书的作者,饥饿游戏,你将从Python运行查询,
提取外键/传统方式
>>> book = BookChoice.objects。filter(book_name__icontains='The Hunger Games') >>> book。book_name《饥饿游戏1》>>> book.author。author_name#Django makes another internal Database query 'Suze Collins'
显然是网站的性能问题,包括最近的奥巴马医改网站如果你想扩展你的web应用程序或服务,这不是一个理想的事情。
使用' select_related '访问外键
下面是Django的' select_related ' queryset API,如下所示,它检索匹配数据库记录的最大外键依赖。使用select_related提取外键,如下面的代码片段所示,
> > >的书= BookChoice.objects.select_related()。filter(book_name__icontains='The Hunger Games') >>> book。book_name#query pulls in all the information including foreign-keys 'The Hunger Games 1' >>> book.author.author_name #Django does not make extra queries here.
显然,在对数据进行广泛分析并需要访问整个记录及其关系时,使用select_related非常有用。虽然完成查询所需的时间稍长一些,但随后的处理时间减少了。
Django文档中有更多关于在select_related中使用查询集的内容API。
总结
Django查询集支持“select_related”API是一种缓存行为,它有助于在每个查询中保留一次数据库访问,而不是在匹配记录中保留每个外键。
像Voldemort这样的缓存框架和Mongo-DB这样的事务数据库可以极大地提高网页的性能;Django自己的优化查询从' select_related '开始。了解更多关于Django的web编程和后端优化的知识,从流行的课程开始,对于初学者来说Python + Django。
了解更多Django
Django框架托管在http://djangoproject.com当前(最新)和过去的软件版本可在MIT许可下下载。
在文档网站上可以找到关于QuerySet和select_related()的Django API参考。
从创建模型到优化web内容交付的各种第三方插件都可以在Django plugin项目中找到。
关于Django好的参考文献包括Adrian Holovaty的经典著作《Django权威指南》(Definitive Guide to Django)。
计划托管一个中型到大型网站?你会想知道关于Python web编程。
已经一个专家吗?不要绝望,我们有一些供您选择
你知道姜戈项目是以姜戈·莱因哈特的名字命名的吗?60年代中后期一位伟大的爵士音乐家。