• ORM some


    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'))  # {}

      分组  annotate(注释)

    # 统计每一本书的作者个数
    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
  • 相关阅读:
    入门菜鸟
    FZU 1202
    XMU 1246
    Codeforces 294E Shaass the Great 树形dp
    Codeforces 773D Perishable Roads 最短路 (看题解)
    Codeforces 814E An unavoidable detour for home dp
    Codeforces 567E President and Roads 最短路 + tarjan求桥
    Codeforces 567F Mausoleum dp
    Codeforces 908G New Year and Original Order 数位dp
    Codeforces 813D Two Melodies dp
  • 原文地址:https://www.cnblogs.com/zhangchen-sx/p/10467033.html
Copyright © 2020-2023  润新知