首页 > 技术文章 > Django CBV 装饰器 命名分组 反向解析

kingon 2018-08-06 19:21 原文

 

1.视图

  1. CBV 和 FBV


    from django.views import View

    class AddPublisher(View):

      def dispatch(self, request, *args, **kwargs):
        ret = super().dispatch(request, *args, **kwargs)

        return ret

      def get(self,request):
        pass

      def post(self,request):
        pass
    使用:
      url(r'^add_publisher/', views.AddPublisher.as_view()),

  2. CBV的简单的流程
    1. AddPublisher.as_view()得到一个view函数
      相当于url(r'^add_publisher/', view),
    2. 请求到来的时候 执行view:
      1. 实例化AddPublisher的类,赋值给self
      2. 执行dispatch方法
      3. 通过反射获取到get或者post的方法
      4. 执行get或者post方法,返回HttpResponse对象
  3. 装饰器的使用
    1. FBV 正常使用
      @装饰器

    2. CBV
      from django.utils.decorators import method_decorator

      1. 给get或者post方法加
      2. 给dispatch方法加
      3. 给类加(写name='get')

  4. request
    request.method 请求方法 GET POST
    request.GET URL传参 {}
    request.POST form表单传的参数
    request.body 请求体
    request.FILES 上传的文件
    request.path_info URL路径 不包含域名和URL参数

    request.get_full_path() URL路径包含URL参数
    request.get_host() 获取IP和端口


  5. response

    1. HttpResponse('字符串') —》 页面看到的就是字符串 content—type: text/html;charset=utf8
    2. render(request,'HTML文件名',{参数}) ——》返回一个页面
    3. redirect('/index/') 跳转 重定向 返回一个响应头 Location:'/index/'
    4. JsonResponse(字典) content—type: application/json
      返回列表时 safe=False
      JsonResponse(data,safe=False)

2. 路由
  1.
    from django.conf.urls import url

    urlpatterns =[
      url(正则表达式,视图,参数,name)
      url(正则表达式,视图,参数,name)
      url(正则表达式,视图,参数,name)
    ]
  2. 正则表达式
    加$
    [0-9] /d
    + 一个或多个
    ?0个或1个
    * 0个或多个
.     除了换行符的所有

  3. 分组和命名分组

      url(r'book/[0-9]{4}/[0-9]{2}/',views.book)

   无名分组:
      url(r'book/([0-9]{4})/([0-9]{2})/',views.book)
      按照位置传参的方式传给视图


   命名分组
      url(r'book/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/',views.book)
      按照关键字传参的方式给视图

      捕获到的参数都是字符串

  4.

    命名url和url的反向解析
      url(r'home',view,home,name='home')
      url(r'book/([0-9]{4})/([0-9]{2})/',views.book,name='book')
      url(r'book/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/',views.book,name='book2')


    视图中反向解析URL:
      from django.shortcuts import reverse

      reverse('home') ——》 /home/
      reverse('book',args=('1999','08')) ——》/book/1999/08/
      reverse('book2',kwargs={'year':'1998','month':'08'}) ——》 /book/1998/08/


    模板中反向解析URL:
      {% url 'home' %} ——》 /home/
    无名分组:

      {% url 'book' '1999' '08' %} ——》/book/1999/08/

    有名分组:
      {% url 'book' '1999' '08' %} ——》/book/1999/08/
      {% url 'book' year='1999' month='08' %} ——》/book/1999/08/
      {% url 'book' month='08' year='1999' %} ——》/book/1999/08/

  5. include
    from app01 import urls as app01_urls
    from app02 import urls as app02_urls

    url('app01/', include(app01_urls)),
    url('app02/', include(app02_urls))



    url('app01/', include('app01.urls')),
    url('app02/', include('app02.urls'))

  5. namespace


3. ORM
  1. mysql的配置
    1. 创建mysql数据库
    2. settings配置
      ENGINE: 'mysql'
      NAME: '数据库名称'
      HOST:IP
      PORT: 3306
      USER: 'root'
      PASSWORD: ''

  3. 告诉django使用pymysql来连接mysql数据库
    在项目同名的文件夹下的__init__.py中写:
    import pymysql
    pymysql.install_as_MySQLdb()

  4. 创建model
    class Person(models.Model)
    name = models.CharField(max_length=32)

  5. 执行两条数据库命令
    python manage.py makemigrations # 记录models的变更记录
    python manage.py migrate # 把变革记录更新到数据库中

2. ORM操作

  1. 查
    models.Person.objects.all() # 查所有
    models.Person.objects.get(id=1,name='xxx') # 查一个对象 满足条件的
    models.Person.objects.filter(id=1,name='xxx') # 查询满足条件的所有对象 列表
    models.Person.objects.filter(id=1,name='xxx').order_by('id')

    属性:
      pub_obj.name

    外键的 book
      book_obj.name
      book_obj.publisher ——》 这是书籍关联的出版社对象
      book_obj.publisher_id ——》 这是数据库存的数据
      book_obj.publisher.id
      book_obj.publisher.name

    多对多 author

      author.name

      author.books ——》 多对多的管理对象
      author.books.all() 所有作者关联的书籍对象列表

  2. 增加:
    models.Publisher.objects.creatte(name='xxxx')

    外键
    models.Book.objects.create(name='xxxx',publisher=pub_obj)
    models.Book.objects.create(name='xxxx',publisher_id=pub_obj.id)

    多对多

    author_obj = models.Author.objects.creatte(name='xxx')
    author_obj.books.set([1,2,3])

  3. 删除
    models.Publisher.objects.get(id=1).delete()
    models.Publisher.objects.filter(id=1).delete

  4. 修改

    pub_obj.name = new_name
    pub_obj.save()

    book_obj.name= new_name
    book_obj.publisher = new_pub_obj
    book_obj.publisher_id = 2
    book_obj.save()

    author_obj.name=new_name
    author_obj.save()


    author_obj.books.set([1,2])     

   文洲

  1. ORM 单表操作:
    1. create
    2. get
    3. delete
    4. 修改
      1. update() --> 只更新指定字段
      2.  obj.属性 = 值 --> 所有字段都更新
        obj.save()
    5. ORM外键操作
      1. 外键应该设置在哪一张表里 --> 通常放在多的那一边
      2. 正向查 .属性
      3. 反向查 表名_set.all()
    6. 多对多字段
      1. 多对多字段应该设置在哪一张表?
      2. 多对多的方法
        1. add
        2. set
        3. clear
        4. remove
    7. ORM进阶
      1. 聚合和分组
      2. F和Q
        1. F:字段与字段之间作比较的时候用F/使用原来字段的值做更新的时候
        2. Q: 对查询做并集操作时
      3. 事务

推荐阅读