django官方文档读书笔记
写在前面:这算是第二次读英文原文文档,第一次是读scrapy,感觉还是要做笔记,好记性不如烂笔头,现在已经忘了scrapy文档讲了什么了,心疼。以后要多读多写
经过半年的基础学习(懒,拖延)终于来到web开发这一步,当时买了董大的web实战,准备是用flask来实现的,但是后面在逼乎上找到某培训班的django视频资源,所以最终还是决定用django。
看过各种对django的评价之后,个人总结django是一个已经高度框架化的框架了(笑),他的每一部分M,V,T都已经帮用户分好了,用户可自主选择不多,但是我也是相信一个理念,就是不需要给用户过多的选择,起码在现阶段,用django准备好给我的就已经够了。
最开始先是完成了官方给新手准备好的tutorial,这个入门练习里带着我去实现一个在带有投票功能的小widget(网站?),主题功能就是可以投票,然后显示票数(whatever),这都不是重点,重点是介绍了M部分,就是DATA的管理,V部分,逻辑的管理,T部分,网页模板的管理,然后介绍了django有自带admin后台模块,还要让我们知道单元测试的重要性,至于最后的打包,复用,我就跳过了。
以下要认真写了:
model layer
分而治之是程序设计的基本理念,model层就是一个只处理数据的层,django提供好了orm,我们需要做的就是将我们想要创建的表(列),用python语言表达出来就行了。比如一个表,就是一个类,类中的属性就是表里面列。
from django.db import models class Musician(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
instrument = models.CharField(max_length=100) class Album(models.Model):
artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
release_date = models.DateField()
num_stars = models.IntegerField()
这是文档中的example,通过例子可以很直观地理解到model的用法。要注意,如果我们定义表时,未指定主键,django会自动创建主键。
列的名字可以通过field的参数指定,如果不指定,django会以属性名来做列名。
关系型数据库,django是有提供了一对多,多对一,多对多的feild。PS:一开始我是没有明白这些对应关系的,由于数据库基础不扎实。不过只要弄懂一个,其他就都明白了。比如拿foreignkey来讲,他是外键约束,就是多对一,比如以上例子,一个musician可以有多个album,所以musician就是album的外键。而具体到往album插入数据时,必须指明是关联到哪个musician才能插入。例子中foreignkey的on_delete参数的意思是外键被删除的时候关联的数据也会被删除。
在model里再增加一个class meta可以自定义一些metadata(这个不知道怎么翻译,我理解成是一些参数规则,文档的原文是anythin that's not a feild,除了feild之外可以是任何东西,比如排列order的顺序是按列来排的,表的名字(不在class meta里面定义verbose_name的话,object会自动命名成class的名字),代理模式(就是用一个继承父类的子类class(这个class只有class meta;proxy=True和各种方法)去操作父类的数据,这样就不用重新对父类进行更改),各种东西吧,跳过跳过)
我们可以为model这个class添加自定义的方法,当然这些方法最好都只是针对数据的,而不是其他。django是为我们提供了很多方法,但是在文档中提到有两个方法我们应该重写的,就是__str__,和get_absolute_url,前者帮助我们阅读,后者是告诉django如何生成object对应的url。要注意的是,无论重写哪个方法,都不要忘记去执行他本来的功能,也就是最好在重写方法时加上SUPER。
model的继承,跟普通class的继承一样,但是要注意的一点,如果在model中的加了class meta,且abstrct=True的话,表明这个model是抽象类,不会被实例化,也就是说在migrate的时候,是不会为这个model创建表的。至于多重继承及要注意的地方,暂时跳过。
index 索引部分,跳过跳过。
model的自带属性中最重要的可以说是manager了,他是db查询方法是实现,默认名字objects,使用example如下:
Entry.objects.filter(pub_date__lte='2006-01-01') # Entry.objects.all().filter(pub_date__lte='2006-01-01') 两者等价
等价的sql就是:SELECT * FROM blog_entry WHERE pub_date<='2016-01-01';
查询是可以链式查询的,具体实现还是可以到时查api。但是这里引入了两个新语法,就是F()和Q(),其中F()的用法就是类似一个指针,举个例子,我们有一个这样的表,表中是记录着小明和他小伙伴的身高,现在我们要取出比小明高的人的数据,那么我们就先要取出小明的身高,然后再用这个数值来做过滤器的参数,再去取出目标数据,那么这将执行两次sql语句;如果用F()方法,就是可以将F(小明身高)这个直接作为过滤器的参数,从而减少操作的次数。Q()语句则是复杂查询的实现,如下:
Poll.objects.get(
Q(question__startswith='Who'),
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)
等价sql:SELECT * from polls WHERE question LIKE 'Who%' AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06') ps:how marvelous
当我们要创建新表,修改,删除时,需要用到以下几个命令:makemigrations,migrate。暂时来讲这两个已经够我用了,makemigrations就是生成修改文件,可做版本管理的功能,migrate就是实操,直接对DB进行操作。一般流程就是,编好model之后,先makemigrations,然后migrate,DB中就会有对应的表了。
剩下部分都是进阶运用了,以后再重新看吧,现在用不上。
View layer
与MVC模式不同的是,django框架是由V来进行逻辑处理。这一层的具体实现可以说是由urls.py和view.py组成。前者规定了url和view函数的对应关系,后者则负责相关的逻辑处理。
urls.py的具体实现,其实也就是用了django内置的url函数,url函数可以接收正则表达式来匹配,并可以将捕获到的参数传给view函数。
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail)
以上例子说明url的使用方法,接收正则,传year,month,day这三个参数到后面view.article_detail这个函数中去。要注意的地方正则的开头不需要匹配'/'但结尾的时候需要(index除外,index的话直接是r'^$'就行了)。
在构造url的方面,有两个很好用的方法:include,reverse。
extra_patterns = [url(r'^reports/$', credit_views.report),]
urlpatterns = [url(r'^credit/', include(extra_patterns)),]
include个人理解为可以减少重复子域的编写。而reverse的作用是构建url,一般情况下,往reverse中传入url或者url的名字,和参数的dict,就可以生成目标url了。
关于命名空间namespace,个人的理解就是在文件中加上app_name这个参数,并在每个文件夹(如templates)再创建app名字的文件夹来避免引用时产生冲突,当然在template中引用变量时最好也加上app的名字。
关于request和response。django中这两个都是object,内置了许多属性和方法,其中request.meta是包含请求头信息的类dict;而response分为两种,httpresponse是类dict,可以向处理dict那样添加数据,这个是一个static(静态)结构,为什么这么讲呢,因为这个response一旦生成,就不能被装饰器或者中间件修改了;而templateResponse则是动态的,在render之前他都可以受装饰器和中间件的修改。要注意的是,django中,url和view处理函数是一一对应的,所以说无论是get还是post或者其他方法,都是会对应到那一个函数上面去的。
对于view中的逻辑处理,逻辑函数可以写成方法,或者类形式。django中内置了很多基础view class来帮助开发,等于是有很多个基础组件来让我们使用,或者组合使用。
剩下的就跳过了。
template layer
这一层是关于前端显示的,暂时对于我的水平来讲,还是用内置的dtl就好了。
感觉以上已经够做一个只展示内容的网站,就先到这里吧。
django官方文档读书笔记的更多相关文章
- 喜大普奔!Django官方文档终于出中文版了
喜大普奔!Django官方文档终于出中文版了 文章来源:企鹅号 - Crossin的编程教室 昨天经 Sur 同学告知才发现,Django 官方文档居然支持中文了! 之所以让我觉得惊喜与意外,是因为: ...
- Effective Go(官方文档)笔记
Effective Go(官方文档)笔记 自己主动局部变量提升(编译期完毕?):return &...; 内置函数: new/make copy, append delete range(这是 ...
- Django官方文档学习1——第一个helloworld页面
Django 1.10官方文档:https://docs.djangoproject.com/en/1.10/intro/tutorial01/ 1.查看django版本 python -m djan ...
- pm2 官方文档 学习笔记
一.安装 1.安装 npm install pm2 -g 2.更新 npm install pm2 -g && pm2 update pm2 update 是为了刷新 PM2 的守护进 ...
- vue.js 2.0 官方文档学习笔记 —— 01. vue 介绍
这是我的vue.js 2.0的学习笔记,采取了将官方文档中的代码集中到一个文件的形式.目的是保存下来,方便自己查阅. !官方文档:https://cn.vuejs.org/v2/guide/ 01. ...
- Vue2.0 官方文档学习笔记
VUE2.0官方文档 基础部分: 1.VUE简介 Vue是一个基于MVVM的框架,其中M代表数据处理层,V代表视图层即我们在Vue组件中的html部分,VM即M和V的结合层,处理M层相应的逻辑数据,在 ...
- [E] Shiro 官方文档阅读笔记 The Reading Notes of Shiro's Offical Docs
官方文档: https://shiro.apache.org/reference.html https://shiro.apache.org/java-authentication-guide.htm ...
- django 官方文档下载
今天发现自己的django文档有点过时了,于是想去下载一份新,找了老半天才找到pdf的下载地址:于是把它记录下来,希望以后可以直接用. 一.进行django官方网站: 二.文档的pdf文件就在docu ...
- python2.7官方文档阅读笔记
官方地址:https://docs.python.org/2.7/tutorial/index.html 本笔记只记录本人不熟悉的知识点 The Python Tutorial Index 1 Whe ...
随机推荐
- 【技巧总结】Penetration Test Engineer[2]-Information gathering
2.信息收集 信息收集是属于前期交互阶段所需要了解的问题. 2.1.前期交互内容 签署授权文件:首要要和受测试方签订授权协议. 划定范围:指定了一个二级域名作为测试目标,那么其他二级域名在测试范围内. ...
- sql loader 控制文件使用十六进制分隔符
最近项目中使用到了sql loader加载数据文件至数据库,提供的文件中使用了十六进制 7F5E 分隔符,在sql loader中如何加载呢? 经过查询实验后,控制文件ctl内容如下: load da ...
- hibernate的枚举注解@Enumerated
@Enumerated(value=EnumType.ORDINAL)采用枚举类型的序号值与数据库进行交互, 此时数据库的数据类型需要是数值类型,例如在实际操作中 CatTest ct = new C ...
- scala tuple中的syntactic sugar
List[Tuple2[String, Int]] // Base List[(String, Int)] // Syntactic sugar List[Tuple3[String, Float, ...
- ArcMap2SLD添加中文支持
首先,你可以从作者提供的链接下载ArcMap2SLD.zip(支持ArcMap10.2) 1.打开LUT_sld_mapping_file.xml文件(上传文件中已经修改)修改文件<LUT> ...
- Python 常用的内建函数
内建函数 Build-in Function,启动python解释器,输入dir(__builtins__), 可以看到很多python解释器启动后默认加载的属性和函数,这些函数称之为内建函数, ...
- linux文件处理
取中间的行数作为train.txt sed -n '1000000,170910580p' train.txt > trainv1.txt 取前面的行数作为dev.txt head -10000 ...
- sqlserver中的循环遍历(普通循环和游标循环)(转载)
sql 经常用到循环,下面介绍一下普通循环和游标循环 1.首先需要一个测试表数据Student
- Python 面试题学习
Python的函数参数传递 在Python中,strings,tuples=('abc',123,2.2,'join),numbers 是不可更改的对象. list=['abc',123,2.23,' ...
- CentOS下用yum命令安装jdk
一.使用yum命令安装 1.查看是否已安装JDK,卸载 [root@192 ~]# yum list installed |grep java java-1.8.0-openjdk.x86_64 ...