简介:许多朋友问有关Django如何实现一定价值的问题。本文的首席执行官注释将为您提供详细的答案,以供您参考。我希望这对每个人都会有所帮助!让我们一起看看!
模型是Django项目的基础。如果起初设计不当,那么在下一个开发过程中将遇到更多问题。或修改模型。这样做的后果是,在下一个开发过程中,我们必须做更多的努力来纠正这些错误。
因此,在修改模型时,我们必须尽可能多地考虑!以下是我们经常使用的一些工具和技术:
南方,对于数据迁移,我们将在每个Django项目中使用它。但是,当Django 1.7时,将会有Django.db。移民。
Django-Model-Utils,用于处理常见模式,例如TimessTampedModel。
django-extensions主要使用shell_plus命令,该命令将自动加载所有应用程序中的所有应用程序
1.基本原则
首先,在不同的应用程序中分发模型。如果您的Django项目中有20多个型号,则应考虑旋转该应用程序。我们建议每个应用程序的模型不超过5码。
其次,尝试使用ORM。我们需要的大多数数据库索引都可以通过对象相关模型来实现,ORM为我们带来了许多快捷方式,例如生成SQL语句,读取/更新数据库时的安全验证。因此,如果您可以使用简单的ORM语句,则应尝试尽可能多地使用ORM。只有当纯SQL语句大大简化ORM语句时,才使用纯SQL语句。并且,在编写纯SQL语句时,应优先使用RAW()然后使用frain()。
第三,如有必要,添加索引。添加db_index = tum tum to to Model非常简单,但是很难理解何时应该添加它。建立模型后,我们不会提前添加索引。索引:
当所有数据库查询中的使用率为10%-25%时
或当有真实数据时,或者可以正确估计使用索引后的效果确实令人满意
第四,请注意模型的继承。该模型的继承需要在Django中非常谨慎。Django提供了三种继承方法,1。Abstract Base类继承(请勿与Pyhton Standard库的ABC模块混合),2。Multi -Table(Multi -Table(Multi -Table(Multi -Table)模型继承。下表列出了这三个继承的优点和缺点:
Django的创建者和许多其他开发人员认为,多观看继承方法不是一个好方法。因此,我们强烈建议您不要使用此方法。以下是选择模型继承的一些常见方法:
如果只有少数模型重复了字段,则无需使用模型继承。您只需要将这些相同的字段添加到每个模型中。
如果您有足够的模型具有重复的字段,则大多数字段是由抽象基类继承的,并且将同一字段提取为抽象基类。
代理模型很少使用,与其他两个继承存在许多差异。
请不要使用多桌继承,因为它既消耗资源又消耗复杂。如果可以,请尝试使用OneTooneFields和Forefore。
在Django项目中,创建时间和修改时间的两个字段最有用。抽象基类继承的示例如下:
2. Django模型设计
如何设计良好的Django模型可能是最难,最复杂的话题。在这里,让我们看一些基本技能:
A。标准化
我们首先建议了解数据库归一化。如果您不知道这是什么,那么我们强烈建议您先阅读相关书籍,或搜索“关系数据库设计”或“数据库标准化”。在模型之前,应首先确保设计数据库。
b。缓存
正确使用缓存来帮助我们提高数据库的性能。详细信息,我们将在未来的文章中进一步介绍。
C.何时使用空和空白
在定义模型字段时,我们可以设置null = true和blank = true(默认值为false),知道何时设置null和空白对开发人员也非常重要。在以下表格中,我们如何列出一个,我们如何一个一个列出,我们如何一个一个列出。使用这两个选项:
D.何时使用binaryfield
在Django 1.6中,添加了二进制文件中的二进制数据(二进制数据或字节)。对于BinaryField,我们不能使用ORM的过滤器,不包括其他SQL操作。但是在少数情况下,我们将使用BinaryField,例如,MessagePack格式的内容,传感器接受的原始数据和压缩数据。但是应该注意的是,二进制数据通常非常大,因此可能会慢慢降低数据库。如果发生这种现象,我们可以存储文件中的二进制数据存储,然后使用文件字段存储文件的路径信息。
另外,请勿直接从BinaryField读取文件,并将其呈现给用户。因为,1。从数据库中读取和写作总是比文件系统慢;2.数据库备份将变得巨大,花更多的时间;它需要更多的时间; 3。获取文件的过程增加了此链接,从Django到数据库。
3.不要替换默认模型管理器
实际上,从ORM获得模型是通过Django的模型管理器完成的。Django为每个模型提供默认模型管理器。我们不建议替换它,因为::::
当使用模型继承时,模型将继承抽象基类模型的模型管理器,而无需继承非提交基类的经理。
Model的第一个模型管理器通常用作默认管理器。替换后,可能会出现不可预测的问题。
4.数据库事务(事务)
在Django 1.6中,每个数据库查询的ORM默认值是使用M.Create()或M.Update()时,每次timeIT都会简化对第一学者对ORM的理解的理解。但是缺点是,当一种视图包含两个数据库修改时,它可能会成功,但另一个视图可能会导致数据库不完整并带来很多危险。
解决此问题的方法是使用数据库事务。在即将到来的一系列数据库操作中,它包含在事务中。当其中一个失败时,其他操作将自动返回。Django 1.6为我们带来了一套新的简单简单简单的简单性。强大的交易机制使我们能够轻松地使用数据库事务。
A。将整个HTTP请求包装在交易中
Django为我们提供了一种简单的方法,可以将所有数据库操作包裹在交易中的HTTP请求中:
您只需要在数据库设置中添加'atomic_requests':TRUE选项,并且可以将整个HTTP请求包装在交易中。这样做的好处显然是安全的,但是劣势可能会下降。因此,我们必须采用更有针对性的交易。其次,应该注意的是,数据库的状态仅是数据库的状态,而不是其他数据库项目,例如发送电子邮件。因此,当涉及这些非数据库项目时,我们应该使用ittransaction.con_atomic_request()docoration()装饰(十年):
b。更清楚的交易控制
更清楚的是,交易控制意味着改善真实问题Web应用程序的性能,但这也意味着更多的开发时间。在大多数网站下,由于流量有限,Atomic_requests的使用就足够了。使用手动交易控制时,请注意:
不要进行数据修改的操作,应将其排除在交易之外
数据修改的操作应在交易中
在特殊情况下,您可以违反上述两个
应当指出的是,当视图返回django.http.streaminghttpresponse时,您应该将atomic_requests设置为false,或使用trassaction.non_atomic_requests修改视图。流由流触发的额外SQL查询将自动成为Django的Django Defaut Autocommit模式。
如果您的桌子是用模型构建的,则类似
班级人(Models.Model):
QQ = model.Charfield(max_length = 100)
如果要在人模型中获取最大值,则可以使用a = person.objects.lateds('id')。这是与最大ID相对应的模型。a.id是您想要的值,然后a.qq是最大ID的QQ编号
让我们的Django博客应用程序具有以下文章模型:
Blog/models.pyclass帖子(Models.Model):
# 标题
title = models.charfield(max_length = 70)
#正正
body = model.textfield()
#其他属性
def __str __(self):
返回self.title
首先,请参见步骤1,用户在搜索框中输入搜索关键字,因此我们需要为博客上的用户提供搜索表格。HTML表单代码可能是这样的:
形式方法=“ get” action =“/search/”
{%csrf_token%}输入类型=“搜索”占位符=“搜索”需要
按钮类型=“提交”搜索/按钮/表单
特别是,在表单标签下有一个{%csrf_token%}。这是Django捍卫Cross -Site请求伪造(CSRF)攻击的一种机制。如果您不知道CSRF是什么,这没关系。请记住,使用Django时,您必须将{%csrf_token%}添加到前端表单代码。
用户输入搜索关键字并单击搜索按钮后,将数据发送到Django背景服务器。表单的操作属性的值为 /搜索 /,表明用户提交的结果将发送到/search /this URL.我们绑定此URL的DJANGO视图函数,并在此视图函数中完成上一步2中提到的过程。支持我们在blog /views.py中编写视图函数的代码:
blog/views.pydef搜索(请求):
q = request.get.get('q')
error_msg =''
如果不是Q:
error_msg ='请输入关键字'
返回渲染(请求,'blog/errors.html',{'error_msg':error_msg})
post_list = post.objects.filter(title__icontains = q)
返回渲染(请求,'blog/results.html',{'error_msg':error_msg,
'post_list':post_list})
首先,我们使用request.get.get('q')获取用户提交的搜索关键字。用户通过表格Django提交的django存储在request.get中。这是一个类似于Python字典的对象,因此我们使用GET方法从字典中删除键Q的值,即用户的搜索关键字。此处的字典键称为,因为该字典的键是因为我们表格中输入框的名称属性为Q。如果修改了名称属性的值,则必须对此键的名称进行相应修改。
接下来,我们进行了少量验证。如果用户在不输入搜索关键字的情况下提交表单,则我们不需要执行查询,而是渲染错误的页面来指示用户应输入关键字。
如果用户输入搜索关键字,我们将通过过滤器方法从数据库中滤除所有合格的文章。此处的过滤条件是title__icontains = q,即关键字q包含(包含)关键字q,而前缀i表示,它没有区分情况。iContains是一个字段查找,用于与需要筛选的模型背后的两个下属线保持一致。Django有很多查询表达式。建议留下官方印象,以了解每个表达的角色。将来,您可以快速定位文档以查询文档的目的:现场查找
下一步是渲染搜索结果页面,显示符合搜索条件的文章列表。以下是模板的简单示例:
results.html
{%如果error_msg%} p {{error_msg}/p {%endif%}
{post_list%} div中的帖子
在此处显示文章的相应信息 /div {%空%} div class =“ no-pos”
没有合格的文章 /div {%endfor%}
视图函数后,请记住将视图函数映射到相应的URL。通过我们的表单数据提交的URL为 /搜索 /,因此视图功能搜索被键入URL。
blog/urls.pyurlpatterns = [
#其他URL配置
url(r'^search/$',views.search,name ='search'),]],]]
更大的功绩!
在上面的所有示例中,我们构造的过滤器仅将字段值与一定常数进行比较。如果我们想比较两个字段的值,我们该怎么办?
Django提供了F()来进行此类比较。f()实例可以参考查询中的字段,以比较同一模型实例中两个不同字段的值。
Django支持F()对象与F()对象和常数之间加法,减法,乘法和成型的操作。
关键字参数查询(例如Filter()和其他方法是“和”的方法。如果您需要执行更复杂的查询(例如或语句),则可以使用Q对象。
来自django.db.models导入Q
Q(标题__startswith ='py')
Q可以与|结合使用Q对象。操作符号。当操作员在两个Q对象上使用时,它会产生一个新的Q对象。
查询名称称为水保证金或价格大于100的书
您可以组合并|括号并使用括号进行分组来编写任何复杂的Q对象。在同一时间,可以使用Q对象?运算符被逆转,从而使组合可以正常查询和抗抗 - (非)查询:
查询函数可以与Q对象和关键字参数混合。提供给查询函数的所有参数(关键字参数或Q对象)为“和”。但是,如果出现Q对象,则必须在所有关键字参数的前面。例如:
查询名称,称为水利润,价格大于100
1. Django获得多个关键值来自帖子:
阿贾克斯:
var语言= {};
语言['英语'] = ['mark','james'];
语言['Spanish'] = ['Amy','John'];
$ .ajax({{{{{{
类型:'post',
URL:'/save/',,
数据:语言,
数据类型:'json'
});
django Views.py
如果request.is_ajax()和request.method =='post':
对于request.post中的键:
打印键
valuelist = request.post.getList(key)
印刷valluelist
-----------------------------------
Fidder:
名称=六月;年龄= 26;
-----------------------------------
Views.py
16对于请求中的键。
----------------------------------------------------------------------------------------------------------------
开发服务器正在使用Control-C在退出服务器上运行。您的Medhod是帖子!名称[U'June']
年龄[U'26'] [04/APR/2012 10:58:11]“ post/getuin/http/1.1” 200 20 20 20
2.一次加载所有值:
def View_example(请求):
data = simplejson.loads(request.raw_post_data)
3.获取多个值作为列表
request.post获取多个值
querydict.getList()ast asl laster/get object从请求/获取对象获取所有复选框(或选择列表)值。
假设我们有一个简单的表单,即以下复选框。每个复选框都包含一个IDIST。1 form method =“ post” action =“ 2 ... 3”名称“”名称“”名称“”名称“”名称“ 1” 1“”名称“”名称“” 1“ 1” 1“ 1”1“ 1” 1“ 1” 1“ 1” 1“ 1” 1“ 1” 1。=“ Artist” type =“复选框” 6 ... 7 /表格
在views.py:1 def handle(请求):2如果请求。Method=='post':3 Artists = request.getList('Artist')#现在艺术家是[1,2,3]的列表
结论:以上是Django如何介绍首席执行官指出Django如何意识到一定价值的全部内容。我希望这对每个人都会有所帮助。如果您想进一步了解这一点,请记住要收集对该网站的关注。