zoukankan      html  css  js  c++  java
  • day20_雷神_django第三天

    django第三天

    动态路由,实现统一删除功能

    urls

    url(r'^host_del/(host|user|group)/(d+)$',views.host_del,name='del'),
    

    template

    <a href="{% url 'app01:del' 'host' obj.id %}" class="btn btn-sm btn-danger">删除</a>
    

    views

    from app01.models import *
    import sys
    def host_del(request,*args):
        table = getattr(sys.modules[__name__],args[0].capitalize())
        host = table.objects.filter(id=args[1])
        host.first().user.clear()
        host.delete()
        return redirect(to='/host_list/')
    

    外键的增改查

    class Book(models.Model):
    		title = models.CharField(max_length=32)
    		publisher = models.ForeignKey('Publisher',related_name='books')
    		
    	book_obj.publisher   ——》 关联的对象
    	
    	book_obj.publisher_id 
    	book_obj.publisher.id 
    	book_obj.publisher.name   
    	
    	不指定related_name
    	pub_obj.book_set   ——》管理对象  
    	pub_obj.book_set.all()   
    	
    	
    	指定related_name='books'
    		pub_obj.books   ——》管理对象  
    		pub_obj.books.all()  
    	
    	
    	Book.objects.filter(publisher__name='')
    	
    	不指定related_name
    		Publisher.objects.filter(book__title='')
    	指定related_name='books'
    		Publisher.objects.filter(books__title='')
    	
    	指定related_name='books',related_query_name='xxx'
    		publisher = models.ForeignKey('Publisher',related_name='books',related_query_name='xxx')
    		
    		Publisher.objects.filter(xxx__title='')
    

    多对多的操作

    正向查询

    author字段里有books字段:
    books = models.ManyToManyField(to='Book')   # Django自动生成第三张表
    
    	 author_obj = models.Author.objects.filter(id__lt=3).first()
    		
    	 	author_obj.books   ——》 管理对象
    	 
    		author_obj.books.all() ——》 所有关联的对象
    		author_obj.books.set([1,2]) ——》 设置多对多关系
    		author_obj.books.set([对象1,对象2]) ——》 设置多对多关系
    		
    		
    		author_obj.books.remove(对象1 或者 id )   ——》 删除某一个多对多关系
    		author_obj.books.clear()   				  ——》 删除所有多对多关系
    		author_obj.books.add(对象1 或者 id )      ——》 删除某一个多对多关系
    		
    		author_obj.books.create()		——》  创建一个新的书籍对象 并且和当前的作者对象做关联
    

    反向查询

    跟外键一样。
    

    聚合和分组

    聚合

    from django.db.models import Sum,Max,Min,Avg,Count
    
    models.Book.objects.aggregate(Sum('price'),Count('price'),max=Max('price'))
    
    分组
    models.Book.objects.annotate(Count('author')).values()   ——》 对象列表  把聚合结果放到对象中
    
    models.Book.objects.values('publisher__name').annotate(min=Min('price')).values('publisher__name', 'min')    ——》最后的values的内容只能是前面提到的  
    

    F和Q

    from django.db.models import F	
    
    F 动态取某个字段的值
    	ret = models.Book.objects.filter(kucun__lt=F('sale')).values()
    	models.Book.objects.update(sale=F('sale')*2)
    Q 条件
    	Q(条件)
    	
    	Q(条件) | Q(条件)  或的关系   or
    	Q(条件) & Q(条件)  与的关系   and
    	~Q(条件)           非的关系   not
    

    事务

    import os
    
    if __name__ == '__main__':
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")
        import django
        django.setup()
    
        import datetime
        from app01 import models
    
        try:
            from django.db import transaction
            with transaction.atomic():
                new_publisher = models.Publisher.objects.create(name="火星出版社")
                models.Book.objects.create(title="橘子物语", publish_date=datetime.date.today(), publisher_id=10)  # 指定一个不存在的出版社id
        except Exception as e:
            print(str(e))
    

    模板之自定义filter、simple_tag、inclusion_tag

    1. 自定义filter

       	1. 在app下创建一个名为templatetags的python包
       	2. 在templatetags下创建python文件 名字可随意  my_tags
       	3. 导入并实例化
       		from  django import template
       		register = template.Library()  # register名字不能改
       		
       	4. 定义函数
       		@register.filter(name='dsb')
       		def add_dsb(value,arg):   # value  变量   arg 冒号后面的参数
       			ret = "{}_{}".format(value,arg)
       			return ret
       			
       	5. 使用:
       		在模板中使用
       		{% load my_tags %}
       		{{ "alex"|dsb:'very_dsb' }}   指定name 用name   没有指定name 用函数名
      
    2. 自定义simple_tag

       	同自定义filter的1、2、3
       	4.定义函数
       	
       		@register.simple_tag()
       		def string_join(*args,**kwargs):
       			ret = '_'.join(args) + '*'.join(kwargs.values())
       			return ret
       	5. 使用
       		在模板中使用
       			{% load my_tags %}
       			{% string_join 'suibian' 'zhensuibian' k1='taisuibian' k2='jiushisuibian' %}
      
    3. 自定义inclusion_tag

       	同自定义filter的1、2、3
       	4.定义函数
       		@register.inclusion_tag('pagination.html')
       		def pagination(total,page):
       			return {'total':range(1,total+1),'page':page}
       			
       	5. 有模板文件 
       		在模板中根据传过来的参数做渲染   ——》 完整的HTML代码段
       		
       	6. 使用
       		在模板中使用
       			{% load my_tags %}
       			{% pagination 10 5%}
      

    cookie

    Cookie的由来
    大家都知道HTTP协议是无状态的。

    无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直
    接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。
    
    一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的。
    
    状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被
    保留。会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。因此Cookie就是在这样
    一个场景下诞生。
    

    什么是Cookie

    Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访
    问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。
    

    Cookie的原理

    cookie的工作原理是:由服务器产生内容,浏览器收到响应后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。
    

    Django中操作Cookie

    获取Cookie

    request.COOKIES['key']
    

    设置Cookie

    rep = HttpResponse(...)
    rep = render(request, ...)
    
    rep.set_cookie(key,value,...)
    

    参数

      1. key, 键
      1. value='', 值
      1. max_age=None, 超时时间
      1. expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
      1. path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
      1. domain=None, Cookie生效的域名
      1. secure=False, https传输
      1. httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

    删除Cookie

    def logout(request):
        rep = redirect("/login/")
        rep.delete_cookie("user")  # 删除用户浏览器上之前设置的user的cookie值
        return rep
    

    session

    http不知道每次请求是谁访问,因为这样快,简单快速,
    
       session写操作
       request.session["user"]=user
       '''      
       1、生成随机字符串
       2、写cookie  {"sessionID":"234asd243dv35fd"}
       3、django-session表:
          session-key           session-data
          234asd243dv35fd       {"user":"alex"}
       '''
       
       session读操作
       user=request.session.get("user")
    
       '''
       1 {"sessionID":"234asd243dv35fd"}  # 先把这个值取出来
       2  django-session表:
          session-key           session-data
          234asd243dv35fd       {"user":"alex"}
       3  {"user":"alex"}.get("user")
       '''
       
       request.session到底是什么?
    
    
    注销:
    	request.session.flush() 删除表中的记录
    My name is 侯冰雷 ~~欢迎转载 ~~欢迎关注 ~~欢迎留言
  • 相关阅读:
    堆表修改内幕
    HBase集群安装
    ZooKeeper群集安装
    CentOS 6+Hadoop 2.6.0分布式集群安装
    Hive中使用Python实现Transform时遇到Broken pipe错误排查
    SQL Server审计功能入门:SQL Server审核 (SQL Server Audit)
    SQL Server审计功能入门:CDC(Change Data Capture)
    SQL Server审计功能入门:更改跟踪(Change Tracking)
    Redis 学习笔记(一) 字符串 SDS
    asp.net mvc core 管道以及拦截器初了解
  • 原文地址:https://www.cnblogs.com/houbinglei/p/9875781.html
Copyright © 2011-2022 走看看