• 使用admin的步骤、必知必会13条、单表的双下划线、外键的操作、多对多的操作:


    MVC

    M: model 模型 与数据库交互

    V: view 视图 HTML

    C:controller 控制器 流程 和 业务逻辑

    MTV

    M:model ORM

    T:template 模板 HTML

    V:view 视图 业务逻辑

    Django中的视图

    FBV

     def add_publisher(request,*args,**kwargs):
      # 逻辑
      return  response

    urls.py

       url(r'^add_publisher',add_publisher )

    CBV

     from django.views import View
     class Addpublisher(View):
      def get(self,reuqest,*args,**kwargs)
             # 处理GET请求的逻辑
             self.request
             return  response
         
         def post(self,reuqest,*args,**kwargs)
             # 处理POST请求的逻辑
             return  response

    urls.py

       url(r'^add_publisher',Addpublisher.as_view() )

    as_view的流程:

    1. 程序加载的时候,执行Addpublisher.as_view():

      定义了一个view函数,返回view

      url(r'^add_publisher',view )

    2. 请求到来时,执行view函数:

      1. 实例化对象 ——》 self

      2. self.request = request

      3. 执行self.dispatch(request, *args, **kwargs)

        1. 判断请求方式是否被允许:

          1. 允许: 通过反射获取请求方式对应的方法(get/post) ——》 handler

          2. 不允许:self.http_method_not_allowed ——》 handler

        2. 执行handler,将它的结果返回

    加装饰器的方法:

    FBV 直接加

    CBV

    from django.utils.decorators import method_decorator

     # 加在方法上
     @method_decorator(login_required)
     def get(self, request, *args, **kwargs):
     
     # 加在dispatch方法上
     @method_decorator(login_required)
     def dispatch(self, request, *args, **kwargs):
         ret = super().dispatch(request, *args, **kwargs)
         return ret
     
     @method_decorator(login_required,name='dispatch')
     class Addpublisher(View)
     
     # 加在类上
     @method_decorator(login_required,name='post')
     @method_decorator(login_required,name='get')
     class Addpublisher(View)
     

    request

     request.method  # 请求方法  GET POST
     request.GET     # url上携带的参数 {} get getlist
     request.POST    # from表单提交POST请求的数据 {} get getlist urlencode
     request.body    # 请求体 bytes
     request.path_info # 当前的路径 不包含IP和端口 也不包含参数
     request.COOKIES  # cookie的数据 {}
     request.session  # session数据 {}
     request.FILES    # 上传的文件   enctype ='multipart/form-data'
     request.META     # 请求头的信息 {} 小写——》大写 HTTP_ - ——》 _
     
     request.get_full_path()  # 获取完整的路径 不包含IP和端口 包含参数 ?
     request.get_host()
     request.is_ajax()
     request.get_signed_cookie(key)

    response

     HttpResponse('字符串')   # 返回字符串
     render(request,'模板的路径',{})  # 返回一个HTML页面
     redirect('地址')  # 重定向 响应头 Location:地址 状态码 301 302
     
     from django.http.response import JsonResponse
     JsonResponse({})  # content-type: application/json
     JsonResponse([],safe=False)

    模板:

    变量 {{ 变量名 }}

    .key > .属性 .方法 > .索引

    filter

    {{ 变量|filter:参数 }}

    default add length slice join first last lower upper title truncatechars truncatewords

    date:"Y-m-d H:i:s" safe

     USE_L10N = False
     DATETIME_FORMAT = 'Y-m-d H:i:s'

    标签 tag {% %}

    for

     {% for i in list  %}
      {{ forloop }}
      {{ i }}
     {% endfor %}

    forloop.counter 循环的序号 从1开始

    forloop.counter0 循环的序号 从0开始

    forloop.revcounter 循环的序号 到1结束

    forloop.revcounter0 循环的序号 到0结束

    forloop.first 是否是第一次循环

    forloop.last 是否是最后一次循环

    forloop.parentloop 当前循环的外层循环 {}

     {% for i in list  %}
      {{ forloop }}
      {{ i }}
     
     {% empty %}
      空空如也
     {% endfor %}

    if

     {% if  条件  %}
      x
     {% elif 条件1 %}
      xx
     {% else %}
      xxx
     {% endif %}

    注意点:

    1. 不支持算数运算

    2. 不支持连续判断 10 > 5 > 1 false

    csf_token

    把{% csrf_token %}放在form表单中,form表单中就有一个隐藏的input框(name='csrfmiddlewaretoken'),就可以提交post请求

    母版和继承

    1. 母版

    将公共的部分提取出来——》 HTML ,在页面中定义block块,让子页面进行替换

    1. 继承

      1. 在子页面中第一行写{% extends '母版的名字' %}

      2. 重写block块

    组件:

    把一小段的HTML代码段 ——》 nav.html

     {% include 'nav.html ' %}

    静态文件的使用:

     {% load static %}
     "{% static '静态文件的相对路径' %}"

     

    ORM

    对应关系:

    类 ——》 表

    对象 ——》 数据行

    属性 ——》 字段

    常用的字段:

     AutoField  自增字段
     IntegerField 整数
     CharField 字符串
     DatetimeField DateField 日期时间
      auto_now:每次修改时修改为当前日期时间。
      auto_now_add:新创建对象时自动添加当前日期时间。
     BooleanField 布尔值
     TextField   大文本
     ImageField 图片
     DecimalField   10进制小数

    字段参数

     null=True   # 数据库中该字段可以为空
     blank=True # 用户输入可以为空
     db_column   # 数据库字段的名
     default     # 默认值
     primary_key # 主键
     db_index   # True 索引
     unique     # 唯一约束
     verbose_name   # 中文提示
     choices       # 让用户选择的数据

    表的参数

         class Meta:
            # 数据库中生成的表名称 默认 app名称 + 下划线 + 类名
            db_table = "person"
     
            # # admin中显示的表名称
            verbose_name = '个人信息'
     
            # verbose_name加s
            verbose_name_plural = '所有用户信息'
     
            # 联合索引
            # index_together = [
            #     ("name", "age"), # 应为两个存在的字段
            # ]
            #
            # # 联合唯一索引
            unique_together = (("name", "age"),) # 应为两个存在的字段

     

    使用admin的步骤:

    1. 创建超级用户

      python manage.py createsuperuser

    2. 注册model

      在app下的admin.py中注册

       from django.contrib import admin
       from app01 import models
       # Register your models here.
       admin.site.register(models.Person)
    3. 访问网站登录操作

    必知必会13条:

    import os

    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
    import django

    django.setup() # 初始化

    from app01 import models

    # all() 查询所有的数据 QuerySet 对象列表
    ret = models.Person.objects.all()

    # filter 获取满足条件的所有的对象 QuerySet 对象列表
    ret = models.Person.objects.filter(name='alex')

    # exclude 获取不满足条件的所有的对象 QuerySet 对象列表
    ret = models.Person.objects.exclude(name='alex')

    # values()
    # 不指定字段 获取所有字段名和值 QuerySet 对象列表 [ {},{} ]
    # 指定字段 values('pid','name') 获取指定字段名和值 QuerySet 对象列表 [ {},{} ]
    ret = models.Person.objects.all().values()
    ret = models.Person.objects.filter(name='alex').values('pid', 'name')

    # values_list()
    # 不指定字段 获取所有的值 QuerySet 对象列表 [ (),() ]
    # 指定字段 values_list('pid','name') 获取指定的值 QuerySet 对象列表 [ (),() ]
    ret = models.Person.objects.all().values_list()
    ret = models.Person.objects.filter(name='alex').values_list('name', 'pid', )

    # order_by 排序 默认升序 -降序 可以多个字段排序
    ret = models.Person.objects.all().order_by('age', '-pid')

    # reverse 对已经排序的QuerySet做的反转
    ret = models.Person.objects.all().order_by('pid').reverse()

    # get 获取满足条件的一个的对象 对象
    ret = models.Person.objects.get(name='alex')

    # first 获取第一个元素 对象 获取不到的时候是none
    ret = models.Person.objects.filter(name='xxx').first()

    # last 获取最后一个元素 对象 获取不到的时候是none
    ret = models.Person.objects.filter(name='xxx').last()

    # count 计数
    ret = models.Person.objects.all().filter(age=84).count()

    # exists 数据是否存在
    ret = models.Person.objects.filter(age=84).exists()

    # distinct 去重 数据时完全一样才去重
    ret = models.Person.objects.filter(age=84).values('age').distinct()

     """
     返回对象列表
     all
     filter
     exclude
     order_by
     reverse
     values   [{}]
     values_list   [()]
     distinct  
     
     返回对象
     get
     first  
     last
     
     返回数字
     count
     
     返回布尔值
     exists
     
     """

    单表的双下划线:

    import os

    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
    import django

    django.setup() # 初始化

    from app01 import models

    ret = models.Person.objects.filter(pk__gt=3) # greater than where pk > 3
    ret = models.Person.objects.filter(pk__gte=3) # greater than equal where pk >= 3

    ret = models.Person.objects.filter(pk__lt=3) # less than where pk < 3
    ret = models.Person.objects.filter(pk__lte=3) # less than equal where pk <= 3

    ret = models.Person.objects.filter(pk__range=[1,3]) # 1 <= pk <= 3
    ret = models.Person.objects.filter(pk__in=[1,3,7,10,100]) # 成员判断

    ret = models.Person.objects.filter(name__contains='bigbao') # like 不忽略大小写
    ret = models.Person.objects.filter(name__icontains='bigbao') # like ignore 忽略大小写

    ret = models.Person.objects.filter(name__startswith='b') # 以什么开头 不忽略大小写
    ret = models.Person.objects.filter(name__istartswith='b') # 以什么开头 忽略大小写

    ret = models.Person.objects.filter(name__endswith='o') # 以什么结尾 不忽略大小写
    ret = models.Person.objects.filter(name__iendswith='o') # 以什么结尾 忽略大小写

    ret = models.Person.objects.filter(age__isnull=False) # 字段是否为空


    ret = models.Person.objects.filter(birth__year='2019') # 按照年份
    ret = models.Person.objects.filter(birth__contains='2019-12-19') # 时间包含


    print(ret)

    外键的操作:

    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=3)
    # print(book_obj)
    # print(book_obj.pub)

    # 反向查询
    # 没有指定related_name 表名小写_set
    pub_obj = models.Publisher.objects.get(pk=2)
    # print(pub_obj.book_set,type(pub_obj.book_set)) # 关系管理对象
    print(pub_obj.book_set.all())

    # related_name='books'
    # print(pub_obj.books.all())


    # 基于字段的查询
    ret = models.Book.objects.filter(pub__name='老男孩出版社')
    # print(ret)

    # 没有指定related_name 类名小写__字段
    ret = models.Publisher.objects.filter(book__name='没有页码的python书')
    # 指定related_name related_name__字段
    ret = models.Publisher.objects.filter(books__name='没有页码的python书')

    # 指定related_query_name='book' related_query_name_name__字段
    # ret = models.Publisher.objects.filter(book__name='没有页码的python书')
    # print(ret)

    多对多的操作:

    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.all())

    book_obj = models.Book.objects.get(pk=1)
    # print(book_obj.author_set.all())

    ret = models.Author.objects.filter(books__name='没有页码的python书')
    ret = models.Book.objects.filter(author__name='bigbao')

    # print(ret)
    # set 设置多对多的关系 [id] [对象]
    # author_obj.books.set([3,])
    # author_obj.books.set( models.Book.objects.all()) # [对象,对象]

    # add 添加多对多的关系 id 对象
    # author_obj.books.add(1,2,3)
    # author_obj.books.add(*models.Book.objects.all()) # *[对象,对象]

    # remove 删除多对多的关系 id 对象
    # author_obj.books.remove(1,2)
    # author_obj.books.remove(*models.Book.objects.filter(pk__in=[1,2])) # [对象,对象]


    # clear 清除多对多的关系
    # author_obj.books.clear()

    # create 新增一个所关联的对象 并且和当前的对象设置关系
    author_obj.books.create(name='跟和尚学合气道', pub_id=1)

    # book_obj.author_set

    # 多对一 反向查询 一 ——》 多 关系管理对象
    # 关系管理对象.set([对象,对象])
    # 关系管理对象.add(对象,对象)

    # 外键字段 null=True, 才有remove,clear
    # 关系管理对象.remove(对象,对象)
    # 关系管理对象.clear()

    # 关系管理对象.create()

  • 相关阅读:
    zoj 3591 Nim 博弈论
    zoj 3529 A Game Between Alice and Bob 博弈论
    zoj 3513 Human or Pig 博弈论
    hdu 3886 Final Kichiku “Lanlanshu” 数位DP
    2013 ACM/ICPC Asia Regional Changsha Online
    2013 ACM/ICPC Asia Regional Changsha Online G Goldbach
    hdu 4753 Fishhead’s Little Game 博弈论+记忆化搜索
    hdu 1404/zoj 2725 Digital Deletions 博弈论
    zoj 2686 Cycle Game 博弈论
    zoj 2290 Game 博弈论
  • 原文地址:https://www.cnblogs.com/zhang-da/p/12069748.html
Copyright © 2020-2023  润新知