zoukankan      html  css  js  c++  java
  • 使用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()

  • 相关阅读:
    hdu 2485 Destroying the bus stations 迭代加深搜索
    hdu 2487 Ugly Windows 模拟
    hdu 2492 Ping pong 线段树
    hdu 1059 Dividing 多重背包
    hdu 3315 My Brute 费用流,费用最小且代价最小
    第四天 下载网络图片显示
    第三天 单元测试和数据库操作
    第二天 布局文件
    第一天 安卓简介
    Android 获取存储空间
  • 原文地址:https://www.cnblogs.com/zhang-da/p/12069748.html
Copyright © 2011-2022 走看看