zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    索引
    静态成员实例
    异常实例
    继承实例
    构造函数实例
    verilog时序优化
    verilog语法笔记
    Idelay进行时序调节
    Vivado综合属性:ASYNC_REG
    verilog分频
  • 原文地址:https://www.cnblogs.com/zhangchen-sx/p/10467033.html
Copyright © 2011-2022 走看看