ORM some

Posted zhangchen-sx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于ORM some的主要内容,如果未能解决你的问题,请参考以下文章

git项目初次push提示error: failed to push some refs to https://gitee.com/xxxx/gittest.git’解决方案 --九五小庞(代码片段

在 Markdown 中,链接到页面片段的最佳方式是啥,即#some_id?

Django ORM:many_to_many.extend(some_queryset)

(Django)气流中的 ORM - 有可能吗?

将大型Java应用程序从MyBatis迁移到ORM

Vscode在使用变量之前转义斜杠