• django_day05


    django_day05

    内容回顾

    内容回顾

    1. 对应关系

      类-------表

      对象-----数据行

      属性------字段

    2. django使用mysql数据库流程

      1. 创建一个mysql数据库

      2. 在settings中配置数据库

        1. ENGINE mysql
        2. NAME 数据库名称
        3. HOST 127.0.0.1
        4. PORT 3306
        5. USER 用户名
        6. PASSWORD 密码
      3. 告诉django使用pymysql模块连接mysql模块

        1. 写在与项目同名的目录下的__init__.py
        2. import pymysql
        3. pymysql.install_as_MySQLdb()
        
      4. 在app下的models.py中写类

        from django.db import models
        class Person(models.Model):
        	name = models.CharField(max_length=32)  #varchar(32)
        
      5. 执行数据库迁移的命令

        python manage.py makemigrations
        python manage.py migrate
        

      常用字段

      AutoField   自增字段 primary=True
      CharField   字符串 max_length
      BooleanField   布尔类型
      IntegerField   整型 -21亿  ---  +21亿  10位  不能存手机号
      DateField
      DateTimeField auto_now = True 新增和编辑时保存当前时间
      			  auto_now_add = True 新增时保存当前的时间
      TextField  文本类型
      
      
      

      字段的参数

      null  数据库可以为空
      blank 用户输入可以为空
      unique 唯一约束
      verbose_name 提示信息
      choices 让用户选择的数据  choices=((1,'男'),(2,'女'))
      default  默认值
      db_column  列名
      

      必知必会13条

      返回对象列表
      all          查询所有的数据
      filter       查询所有满足条件的数据
      exclude      查询所有不满足条件 的数据
      values       查询数据的字段和值[  {} ]
      values_list   查询数据的值   [()]
      order_by     排序  默认升序 -     多字段排序age  id
      reverse      对已经排好序的queryset翻转
      distinct     去重
      
      
      
      返回对象
      get  获取有且唯一的对象
      first
      last 
      
      返回布尔值
      exists
      
      数字
      count
      
      
      

    路由

    url(r'^publisher_list/$',views.publisher_list)
    url(r'^(publisher|book|author)_del/$',views.delete)
    
    正则
    d   w   +   ?   .  *
    
    r'^app01/publisher_list/$'
    

    URL的命名和反向解析

    静态路由
    url(r'^publisher_list/$',views.publisher_list,name=pub)
    
    模板中
     '{% url 'pub' %}' ---   '/publisher_list/'
     
     py文件
     from django.shotcuts  import reverse
     reverse('pub') ---  '/publisher_list/'
     
     分组
     动态路由
     url(r'^publisher_list/(d+)/$',views.publisher_list,name=pub)
     
     模板中
     {% url  'pub' 5 %}    '/publisher_list/5/'
      py文件
     from django.shotcuts  import reverse
     reverse('pub',args=(5,)) ---  '/publisher_list/5/'
     
     
     命名分组  可以按照命名传参 
     动态路由
     url(r'^publisher_list/(?P<pk>d+)/$',views.publisher_list,name=pub)
     
     模板中
     {% url  'pub' 5 %}    '/publisher_list/5/'
     {% url  'pub' pk=5 %}    '/publisher_list/5/'
      py文件
     from django.shotcuts  import reverse
     reverse('pub',args=(5,)) ---  '/publisher_list/5/'
      reverse('pub',kwargs={'pk':'5'} ---  '/publisher_list/6/'
     
     
     
    

    外键

    import os
    
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
    
    import django
    
    django.setup()
    from app01 import models
    
    #基于对象的查询
    #正向查询
    book_obj = models.Book.objects.get(pk=1)
    # print(book_obj.pub)  #关联的出版社对象
    # print(book_obj.pub_id)  #关联的出版社id
    
    #反向查询
    pub_obj = models.Publisher.objects.get(pk=1)
    print(pub_obj)
    # print(pub_obj.book_set,type(pub_obj.book_set))  #类名小写 set  关联所有对象
    # print(pub_obj.book_set.all())
    #指定related_name=‘books’
    # print(pub_obj.books,type(pub_obj.books))  #类名小写 set  关联所有对象
    # print(pub_obj.books.all())
    
    #基于字段查询
    ret = models.Book.objects.filter(pub__name__contains='出版社1')
    
    
    # #不指定related_name='books'
    # ret = models.Publisher.objects.filter(book__name='书1')
    
    # #指定related__name='books' 不指定related_query_name='book'
    # ret = models.Publisher.objects.filter(books__name='书1')
    
    #指定related_query_name='book'
    # ret = models.Publisher.objects.filter(book__name='书1')
    # print(ret)
    
    
    #  set add  create  只有对象  没有id
    pub_obj.books.set(models.Book.objects.filter(id__in=[1,2]))
    
    # remove  clear 不能用
    

    多对多

    import os
    
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
    
    import django
    
    django.setup()
    from app01 import models
    author_obj = models.Author.objects.get(pk=1)
    
    print(author_obj.books)  #关系管理对象
    print(author_obj.books.all())  #所关系对象集合
    
    book_obj = models.Book.objects.get(pk=2)
    # print(book_obj.author_set.all())
    print(book_obj.authors.all())
    
    
    
    # ret = models.Book.objects.filter(authors__name='李世林')
    # ret = models.Author.objects.filter(books__name='书2')
    
    
    #关系管理对象的方法
    #all  查询所有的对象
    #set  设置多对多 的关系 [id,id]
    # author_obj.books.set([1,2])
    #
    # author_obj.books.set(models.Book.objects.filter(id__in=[3,4]))
    
    #add  添加多对多关系
    # author_obj.books.add(1,2)
    # author_obj.books.add(*models.Book.objects.filter(id__in=[5,6]))#列表打散  变成对象
    
    #remove  添加多对多的关系
    # author_obj.books.remove(3,4)
    # author_obj.books.remove(*models.Book.objects.filter(id__in=[5,6]))
    
    #clear 清空多对多的关系
    # author_obj.books.clear()
    
    # create  新建一个对象和当前的对象建立关系
    # author_obj.books.create(name='sdawd',pub_id='1')
    ret= book_obj.authors.create(name='adadadfdcvxdc')
    print(ret)
    

    神奇的下划线

    import os
    
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
    
    import django
    
    django.setup()
    from app01 import models
    ret = models.Person.objects.filter(pid__lt=5)  #less  than 小于
    ret = models.Person.objects.filter(pid__gt=5)  #greater  than 大于
    ret = models.Person.objects.filter(pid__lte=5)  #less  than equal 小于等于
    
    
    ret = models.Person.objects.filter(pid__range=[1,6])  #左右都包含 范围
    ret = models.Person.objects.filter(pid__in=[1,5,6])  #左右都包含  成员判断
    
    ret = models.Person.objects.filter(name__contains='lsl')  # like 模糊查询
    ret = models.Person.objects.filter(name__icontains='lsl')  # like 模糊查询 忽略大小写
    ret = models.Person.objects.filter(name__startswith='l')  # like 模糊查询 以什么开头
    ret = models.Person.objects.filter(name__istartswith='l')  # like 模糊查询 以什么开头 忽略大小写
    # ret = models.Person.objects.filter(name__endwith='l')  # like 模糊查询 以什么结尾
    # ret = models.Person.objects.filter(name__iendwith='l')  # like 模糊查询 以什么结尾 忽略大小写
    
    ret = models.Person.objects.filter(birth__year='2020')  # like 模糊查询 以什么结尾 忽略大小写
    ret = models.Person.objects.filter(birth__month='1')  # like 模糊查询 以什么结尾 忽略大小写
    ret = models.Person.objects.filter(birth__day='1')  # like 模糊查询 以什么结尾 忽略大小写
    ret = models.Person.objects.filter(birth__contains='-02-')  # like 模糊查询 以什么结尾 忽略大小写
    
    ret = models.Person.objects.filter(name__isnull=True) #字段为空
    
    
    print(ret)
    

    聚合与分组

    import os
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
    import django
    django.setup()
    from app01 import models
    from django.db.models import Avg, Sum, Max, Min, Count
    #aggregate  终止子句
    ret = models.Book.objects.all().aggregate(Avg("price"))# 返回字典 #{'price__avg': 205.483333}
    ret = models.Book.objects.all().aggregate(average_price=Avg('price'))# 返回字典{'average_price': 205.483333}
    ret = models.Book.objects.all().aggregate(Avg("price"), Max("price"), Min("price"))# 返回字典{'price__avg': 205.483333, 'price__max': Decimal('999.00'), 'price__min': Decimal('9.90')}
    ret = models.Book.objects.aggregate(Avg("price"), Max("price"), Min("price"))# 返回字典{'price__avg': 205.483333, 'price__max': Decimal('999.00'), 'price__min': Decimal('9.90')}
    ret = models.Book.objects.filter(id__gt=2).aggregate(Avg("price"), Max("price"), Min("price"))# 返回字典{'price__avg': 205.483333, 'price__max': Decimal('999.00'), 'price__min': Decimal('9.90')}
    
    print(ret)
    
    #分组  group_by
    
    #统计每一本书的作者个数
    #annotate注释的意思  添加额外的信息
    ret= models.Book.objects.annotate(Count('authors')).values()
    for i in ret:
        print(i)
    
    ##统计出每个出版社买的最便宜的书的价格
    ret = models.Publisher.objects.annotate(Min('book__price')).values()
    #按照pub_id pub_name分组
    ret = models.Book.objects.values('pub','pub__name').annotate(Min('price'))
    
    publisher_list = models.Publisher.objects.annotate(min_price=Min("book__price"))
    for i in ret:
        print(i)
    
    #统计不止一个作者的图书
    ret = models.Book.objects.annotate(count=Count('authors')).filter(count__gt=1)
    print(ret)
    
    #根据一本图书作者数量的多少对查询集 QuerySet进行排序
    ret = models.Book.objects.annotate(count=Count('authors')).order_by('-count')
    print(ret)
    #查询各个作者出的书的总价格
    
    ret = models.Author.objects.annotate(sum=Sum('books__price')).values()
    ret = models.Book.objects.values('authors','authors__name').annotate(sum=Sum('price'))
    for i in ret:
        print(i)
    

    F和Q

    import os
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
    import django
    django.setup()
    from app01 import models
    from django.db.models import Avg, Sum, Max, Min, Count,F,Q
    
    
    ret = models.Book.objects.filter(sale__gt=F('repertory')) #where 'sale' > 'repertory'
    
    
    ret = models.Book.objects.filter(id__lte=3).update(sale=F('sale')*2 + 12)
    
    ret = models.Book.objects.filter(Q(id__lt=3)|Q(id__gt=5)) #或者的关系
    ret = models.Book.objects.filter(Q(Q(id__lt=3)|Q(id__gt=5))&Q(name__startswith='lsl')) #与的关系
    # ret = models.Book.objects.exclude(id__gte=3,id__lte=5)
    """
    Q()
    
    | 或者
    
    & 并且
    
    ~ 非
    
    """
    
    print(ret)
    

    事务

    import os
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
    import django
    django.setup()
    from app01 import models
    from django.db.models import Avg, Sum, Max, Min, Count,F,Q
    from django.db import transaction
    
    try:
        with transaction.atomic():
            #一系列的操作
            models.Book.objects.all().update(repertory=F('repertory') - 10)
            int('sss')
            models.Book.objects.all().update(sale=F('sale') + 10)
    except Exception as e:
        print(e)
    
    1. 保存在浏览器本地上的一组组键值对

    2. 特性:

      1. 由服务器让浏览器进行设置的
      2. cookie信息保存在本地浏览器 有权不保存
      3. 浏览器再次访问时自动携带对应的cookie
    3. django中操作cookie

      #设置cookie
      request.set_cookie(key,value)  # Set-Cookie: is_login=1
      response.set_signed_cookie(key, value,salt='s28')#加密cookie
      
      #获取
      request.COOKIES.get(key)#请求头  Cookie : is_login = 1;
      request.get_signed_cookie(key,salt='s28',default='')#加密cookie
      
      #删除cookie  设置cookie值为空  超时时间为0
      response.delete_cookie(key)
      
    4. 参数

      • key, 键
      • value='', 值
      • max_age=None, 超时时间
      • expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
      • path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
      • domain=None, Cookie生效的域名
      • secure=False, https传输
      • httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
  • 相关阅读:
    uva12436 回头再做一次
    Redhat中网络启动错误解决办法( Failed to start LSB: Bring up/down networking RTNETLINK answers: File exists)
    LNMP环境搭建Wordpress博客
    LNMP环境搭建Wordpress博客
    LAMP环境搭建一个Discuz论坛
    LAMP环境搭建一个Discuz论坛
    常见的SQL语句
    常见的SQL语句
    Linux系统中安装软件的几种方式
    Linux系统中安装软件的几种方式
  • 原文地址:https://www.cnblogs.com/DemoLi/p/12770054.html
Copyright © 2020-2023  润新知