Django框架总结
Web应用
问题1:描述一个Web应用的工作流程。(如上图所示)
问题2:描述项目的物理架构。(上图中补充反向代理服务器、负载均衡服务器、数据库服务器、文件服务器、缓存服务器、防火墙等,每个节点都有可能是多节点构成的集群)
问题3:描述Django项目的工作流程。(如下图所示)
MVC架构模式
问题1:为什么要使用MVC架构模式?(模型和视图解耦合)
问题2:MVC架构中每个部分的作用?(如上图所示)
HTTP请求和响应
HTTP请求
HTTP请求 = 请求行+请求头+空行+[消息体]
HTTP响应 = 响应行+响应头+空行+消息体
HTTPRequest
对象的属性和方法:
method
path
/get_full_path()
scheme
/is_secure()
/get_host()
/get_port()
META
/COOKIES
GET
/POST
/FILES
get_signed_cookie()
is_ajax()
body
/content_type
/encoding
中间件添加的属性:
session
/user
/site
HttpResponse
对象的属性和方法:
set_cookie()
/set_signed_cookie()
/delete_cookie()
__setitem__
/__getitem__
/__delitem__
charset
/content
/status_code
JsonResponse
(HttpResponse
的子类型)对象class HouseJsonEncoder(JsonEncoder): def default(self, o): # 定义如何将对象转成dict类型并返回这个字典 pass
>>> from django.http import JsonResponse >>> response = JsonResponse({ 'foo': 'bar'}) >>> response.content >>> response = JsonResponse([1, 2, 3], safe=False) >>> response = JsonResponse(house, encoder=HouseJsonEncoder) >>> response = HttpResponse('') >>> response['cotent-type'] = 'application/pdf'; >>> response['content-disposition'] = 'inline; filename="xyz.pdf"' >>> response['content-disposition'] = 'attachment; filename="xyz.pdf"' >>> response.set_signed_cookie('', '', salt='') >>> response.status_code = 200
数据模型(Model)
问题1:关系型数据库表的设计应该注意哪些问题?(范式理论)
问题2:关系型数据库中数据完整性指的是什么?(实体完整性/参照完整性/域完整性)
问题3:ORM是什么以及解决了什么问题?(对象模型-关系模型双向转换)
Field
及其子类的属性:- 通用选项:
db_column
/db_tablespace
null
/blank
/default
primary_key
db_index
/unqiue
choices
/help_text
/error_message
/editable
/hidden
- 其他选项:
CharField
:max_length
DateField
:auto_now
/auto_now_add
DecimalField
:max_digits
/decimal_places
FileField
:storage
/upload_to
ImageField
:height_field
/width_field
- 通用选项:
ForeignKey
的属性:重要属性:
db_constraint
(提升性能或者数据分片的情况可能需要设置为False)on_delete
CASCADE
:级联删除。PROTECT
:抛出ProtectedError
异常,阻止删除引用的对象。SET_NULL
:把外键设置为null
,当null
属性被设置为True
时才能这么做。SET_DEFAULT
:把外键设置为默认值,提供了默认值才能这么做。related_name
class Dept(models.Model): pass class Emp(models.Model): dept = models.ForeignKey(related_name='+', ...) Dept.objects.get(no=10).emp_set.all() Emp.objects.filter(dept__no=10)
其他属性:
to_field
/limit_choices_to
/swappable
Model
的属性和方法objects
/pk
save()
/delete()
from_db()
/get_XXX_display()
/clean()
/full_clean()
QuerySet
的方法get()
/all()
/values()
count()
/order_by()
/exists()
/reverse()
filter()
/exclude()
exact
/iexact
:精确匹配/忽略大小写的精确匹配查询contains
/icontains
/startswith / istartswith / endswith / iendswith
:基于like
的模糊查询in
:集合运算gt
/gte
/lt
/lte
:大于/大于等于/小于/小于等于关系运算range
:指定范围查询(SQL中的between…and…
)year
/month
/day
/week_day
/hour
/minute
/second
:查询时间日期isnull
:查询空值(True
)或非空值(False
)search
:基于全文索引的全文检索regex
/iregex
:基于正则表达式的模糊匹配查询aggregate()
/annotate()
Avg
/Count
/Sum
/Max
/Min
>>> from django.db.models import Avg >>> Emp.objects.aggregate(avg_sal=Avg('sal')) (0.001) SELECT AVG(`TbEmp`.`sal`) AS `avg_sal` FROM `TbEmp`; args=() {'avg_sal': 3521.4286}
>>> Emp.objects.values('dept').annotate(total=Count('dept')) (0.001) SELECT `TbEmp`.`dno`, COUNT(`TbEmp`.`dno`) AS `total` FROM `TbEmp` GROUP BY `TbEmp`.`dno` ORDER BY NULL LIMIT 21; args=() <QuerySet [{ 'dept': 10, 'total': 4}, { 'dept': 20, 'total': 7}, { 'dept': 30, 'total': 3}]
first()
/last()
only()
/defer()
>>> Emp.objects.filter(pk=7800).only('name', 'sal') (0.001) SELECT `TbEmp`.`empno`, `TbEmp`.`ename`, `TbEmp`.`sal` FROM `TbEmp` WHERE `TbEmp`.`empno` = 7800 LIMIT 21; args=(7800,) <QuerySet [<Emp: Emp object (7800)>]> >>> Emp.objects.filter(pk=7800).defer('name', 'sal') (0.001) SELECT `TbEmp`.`empno`, `TbEmp`.`job`, `TbEmp`.`mgr`, `TbEmp`.`comm`, `TbEmp`.`dno` FROM `TbEmp` WHERE `TbEmp`.`empno` = 7800 LIMIT 21; args=(7800,) <QuerySet [<Emp: Emp object (7800)>]>
create()
/update()
/raw()
>>> Emp.objects.filter(dept__no=20).update(sal=F('sal') + 100) (0.011) UPDATE `TbEmp` SET `sal` = (`TbEmp`.`sal` + 100) WHERE `TbEmp`.`dno` = 20; args=(100, 20) >>> >>> Emp.objects.raw('select empno, ename, job from TbEmp where dno=10') <RawQuerySet: select empno, ename, job from TbEmp where dno=10>
Q
对象和F
对象>>> from django.db.models import Q >>> Emp.objects.filter( ... Q(name__startswith='张'), ... Q(sal__lte=5000) | Q(comm__gte=1000) ... ) # 查询名字以“张”开头且工资小于等于5000或补贴大于等于1000的员工 <QuerySet [<Emp: 张三丰>]>
reporter = Reporters.objects.filter(name='Tintin') reporter.update(stories_filed=F('stories_filed') + 1)
原生SQL查询
from django.db import connection with connection.cursor() as cursor: cursor.execute("UPDATE TbEmp SET sal=sal+10 WHERE dno=30") cursor.execute("SELECT ename, job FROM TbEmp WHERE dno=10") row = cursor.fetchall()
模型管理器
class BookManager(models.Manager): def title_count(self, keyword): return self.filter(title__icontains=keyword).count()
视图函数(Controller)
如何设计视图函数
用户的每个操作对应一个视图函数。
每个视图函数构成一个事务边界。
事务的概念。
事务的ACID特性。
事务隔离级别。
Read Uncommitted < Read Committed < Repeatable Read < Serializable
set global transaction isolation level repeatable read; set session transaction isolation level read committed; select @@tx_isolation;
Django中的事务控制。
- 给每个请求绑定事务环境(反模式)。
ATOMIC_REQUESTS = True
- 使用事务装饰器。
@transaction.non_atomic_requests @transaction.atomic
- 使用上下文语法。
with transaction.atomic(): pass
- 关闭自动提交。
AUTOCOMMIT = False
transaction.commit() transaction.rollback()
URL配置
可以让部分URL只在调试模式下生效。
from django.conf import settings urlpatterns = [ ... ] if settings.DEBUG: urlpatterns += [