1 --
增 models.表名(类).objects.create(字段1=值,字段2=值) 查 models.表名(类).objects.get(pk = 3) models.表名(类).objects.filter(pk = 3) models.表名(类).objects.all() 删 models.表名(类).objects.get(pk = 3).delete() models.表名(类).objects.filter(pk = 3).delete() 改 obj= models.表名(类).objects.get(pk = 3) obj.name = new_name obj.save()
2 --
外键 创建外键: 字段名 = models.ForeignKey('关联表名'',on_delete=models.CASCADE) 加 ' ' 是通过反射寻找, 同级删除
3 -- 过滤器
语法 {{value|filter_name:参数 }}} 变量 过滤的 显示的 with -- 用法 {% with 变量 as 变量新名字%} 自定义 过滤器 -- filter -- {% load py文件名 %} {{ value|过滤器名称 }}} simple_tag(*args,**kwargs) -- load {% 函数名 参数 %} inclusion_tag('xxx.html') -- load {% 函数名 参数 %}
-- -- -- --
# filter
@register.filter
def x1(value,arg='xxx'):
return True
# simple_tag
@register.simple_tag
def x2(*args,**kwargs):
return True
@register.inclusion_tag('li.html')
def show_li(num):
return {'num':range(num)}
4 -- 装饰器 - 闭包函数 - 在不改变原函数的代码和调用方式的基础上,给原函数增加功能
def wrapper(func): def inner(*args,**kwargs): # 原函数执行之前 ret = func(*args,**kwargs) # 原函数执行之后 return ret return inner @wrapper # func1 = wrapper(func1) def func1(): print('func1')
5 - CBV
from django.views import View class AddPublisher(View): def get(self,request): return response def post(self,request): return response
使用 -- url(r'^add_publisher/', views.AddPublisher.as_view()),
CBV 流程
程序运行到 类.as_view() 执行, 得到view函数 请求到来的时候,执行view,实例化类-->self self.request = request 执行self.dispatch(request,*args,**kwargs) 判断请求方式是否被允许 允许: 反射获得相应请求方式的方法 -->Handler 不允许: self.http_method_not_allowed ——》handler 执行 handler--> 返回响应
加装饰器 FBV 直接加装饰器就行
CBV
from django.utils.decorators import method_decorator # 1。加载某一个方法上 @method_decorator(timer) def get(self, request): # 2. 加载dispatch方法上面 所有映射的方法都有了 @method_decorator(timer) def dispatch(self, request, *args, **kwargs): # 3. 加在类上 @method_decorator(timer, 'post') @method_decorator(timer, 'get') class AddPublisher(View):
6 -- request 对象
print(request.method) # 请求方式 GET POST PUT print(request.GET) # URL携带的参数 { ‘name’: ['alex'] } [] .get('name') print(request.POST) # POST请求提交的数据 { ‘name’: ['alex'] } .getlist() print(request.path_info) # 路径信息 不包含ip和端口 参数 print(request.FILES) print(request.META) print(request.COOKIES) print(request.session) print(request.get_host()) print(request.get_full_path()) # 路径信息 不包含ip和端口 带参数 print(request.is_ajax()) # 判断是否是ajax请求
7 -- response 对象
HttpResponse('字符串 ') ——》 页面展示 字符串 render(request,'html文件名', { k1:v1 }) ——》 返回一个完整HTML页面 redirect(’要跳转的地址‘) ——》重定向 Location : 地址 JsonResponse:
from django.http import JsonResponse def json_data(request): data = {'id': 11, 'name': 'alex'} l1 = ['alex', 'peiqi'] return JsonResponse(l1, safe=False) # Content-Type: application/json
8 -- 路由
分组 -- url(r'^blog/([0-9]{4})/([0-9]{2})/$', views.blog), 获取到的参数位子参数传递给视图函数
命名分组 -- url(r'^blog/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.blog), 参数 关键字 传递给视图函数
include -- 路由分配
from django.conf.urls import url, include from django.contrib import admin from app01 import views urlpatterns = [ url(r'^app01/', include('app01.urls')), url(r'^app02/', include('app02.urls')), ]
9 -- 视图 views.py 就是业务逻辑
10 -- namespace 反向解析
url 反向解析 url(r'^web/$',views.web,name='web') 视图中 - reverse('web') 模板中 - { % url 'web' %}
namespace -- 命名空间
url('app01/', include('app01.urls', namespace='app01')),
url('app02/', include('app02.urls', namespace='app02'))
11 - 聚合 aggregate
from django.db.models import Max, Min, Sum, Count, Avg # aggregate()是QuerySet 的一个终止子句 ret = models.Book.objects.all().aggregate(max=Max('price'), min=Min('price')) # {} ret = models.Book.objects.filter(publisher__name='得劲出版社').aggregate(max=Max('price'), min=Min('price')) # {}
分组
# 统计每一本书的作者个数 ret = models.Book.objects.annotate(Count('author')) # xxx # 统计出每个出版社买的最便宜的书的价格 ret = models.Publisher.objects.annotate(Min('book__price')).values() ret = models.Book.objects.values('publisher__name').annotate(Min('price')) ret = models.Book.objects.values('publisher').annotate(min=Min('price')).values('publisher__name', 'min', ) # 统计不止一个作者的图书 ret = models.Book.objects.annotate(count=Count('author')).filter(count__gt=1) # 根据一本图书作者数量的多少对查询集 QuerySet进行排序 ret = models.Book.objects.annotate(count=Count('author')).order_by('-count') # 查询各个作者出的书的总价格 ret = models.Author.objects.annotate(Sum('books__price')).values()
F 和 Q
F -- 动态获取字段的值 from django.db.models import F, Q ret = models.Book.objects.filter(sale__gt=F('kucun')).values() # 两个字段的值进行比较 # book_obj = models.Book.objects.get(pk=1) # book_obj.price = 900 # book_obj.save() models.Book.objects.all().update(sale=F('sale') * 2) # 给一个字段的所有值都更新
Q 条件 # ~ 非 # | 或 # & 与 # Q(id__lt=2) 即为一个条件 ret = models.Book.objects.filter(~Q(Q(id__lt=2) | Q(id__gt=4)) & Q(id__gt=3))
事务
from django.db import transaction try: with transaction.atomic():
# ORM 语句 models.Publisher.objects.create(name='裤夹尾出版社') # ..... 一系列操作 except Exception as e: print(e)
只要有一个 ORM 语句错误都不会成功执行
12 -- cookie 和 session
cookie 保存在浏览器上的一个个键值对 特点 -- 服务器让浏览器设置的, 浏览器保存在本地 有权利不设置,下次访问相同地址时候携带对应的cookie 设置 cookie ret= redirect('index') ret.set_cookie('键','值') 获取 request.cookies 加密设置 ret.set_signed_cookie('键','值','盐') 获取 request.get_signed_cookie(键,salt='盐',default='') 超时时间 max_age=时间
session -- 保存在 服务器上的 一组组键值对,依赖于cookie 为什么用session? cookie 保存在浏览器上不安全 cookie 在请求头 传递数据 大小和数量有限制 设置: request.session['键'] = 值 获取: request.session.get('键') 删除session: ret =redirect('/login/') ret.delete_cookie('user') del request.session['k1']
request.session.delete() # 删除当前回话的所有session数据,不删除cookie
request.session.flush() # 删除当前回话的所有session数据,删除cookie