zoukankan      html  css  js  c++  java
  • django框架三

    今日内容概要

    • 数据的查,改,删

    • django orm中如何创建表关系

    • django请求生命周期流程图(重要)

    • 详细的讲django每一个部分的详细内容

      • 路由层(urls.py)
      • 虚拟环境
      • django版本区别

    数据的查,改,删

    视图函数中:
    # 查看
    def userlist(request):
        # 查询出用户表里面所有的数据
        # 方式1
        data = models.User.objects.filter()
        # print(data)
        # 方式2
        user_queryset = models.User.objects.all()
        # return render(request,'userlist.html',{'user_queryset':user_queryset})
        return render(request,'userlist.html',locals())
    
    # 编辑功能
    	# 点击编辑按钮朝后端发送编辑数据的请求
    
    如何告诉后端用户想要编辑哪条数据?将编辑按钮所在的那一行数据的主键值发送给后端
    
    url?edit_id=1  # 添加request的属性
    url/1/  # 无名分组,传参数
    
    
      # 后端查询出用户想要编辑的数据对象 展示到前端页面供用户查看和编辑
      def edit_user(request):
        edit_id = request.GET.get('user_id')
        edit_obj = models.User.objects.filter(id=edit_id).first()
        if request.method == "POST":
            username = request.POST.get('username')
            password = request.POST.get('password')
            # 去数据库中修改对应的数据内容
            # 修改数据方式1
    	 models.User.objects.filter(id=edit_id).update(username=username,password=password)
            """
                将filter查询出来的列表中所有的对象全部更新,批量更新操作
                只修改被修改的字段
            """
    
            # 修改数据方式2
            edit_obj.username = username
            edit_obj.password= password
            edit_obj.save()
            """
                上述方法当字段特别多的时候效率会非常的低
                从头到尾将数据的所有字段全部更新一边 无论该字段是否被修改
            """
    # Negative indexing is not supported. 不支持负数索引
    		print(models.Book.objects.filter(id=id)[0])
        
    # obj 必须将filter.first() 赋值给 obj 然后对obj进行操作,如下不行。
    # 每次取出的都是之前的对象,没变。最后一条,取出来再 save。。。
            obj = models.Book.objects.filter(id=id).first()
            models.Book.objects.filter(id=id).first().book_name=book_name
            models.Book.objects.filter(id=id).first().price=price
            models.Book.objects.filter(id=id).first().save()
            
    # 删除功能 批量删除
    
    def delete_user(request):
        delete_id = request.GET.get('user_id')
        models.User.objects.filter(id=delete_id).delete()
    
    	"""
    # 真正的删除功能应该需要二次确认 我们这里先不做
    # 删除数据内部其实并不是真正的删除 我们会给数据添加一个标识字段用来表示当前数据是否被删除了,如果数据被删了仅仅只是讲字段修改一个状态
    	username password	is_delete
      jason			123				0
      egon			123				1
    

    django orm中如何创建表关系

    """
    表与表之间的关系
    	一对多
    	
    	多对多
    	
    	一对一
    	
    	没有关系
    
    判断表关系的方法:换位思考
    """
    from django.db import models
    
    # 创建表关系  先将基表创建出来 然后再添加外键字段
    class Book(models.Model):
        title = models.CharField(max_length=32)
        price = models.DecimalField(max_digits=8,decimal_places=2)
        # 总共八位 小数点后面占两位
        publish = models.ForeignKey(to='Publish')  # 默认就是与出版社表的主键字段做外键关联
        """
        如果字段对应的是ForeignKey 那么会orm会自动在字段的后面加_id
        加了_id那么orm还是会在后面继续加_id
        """
        authors = models.ManyToManyField(to='Author')
        """
        authors是一个虚拟字段 主要是用来告诉orm 书籍表和作者表是多对多关系
        让orm自动帮你创建第三张关系表
        """
    class Author(models.Model):
        name = models.CharField(max_length=32)
        age = models.IntegerField()
        author_detail = models.OneToOneField(to='AuthorDetail')
        """
        OneToOneField也会自动给字段加_id后缀也不要自己加_id
        """
    
    class AuthorDetail(models.Model):
        phone = models.BigIntegerField()  # 或者直接字符类型
        addr = models.CharField(max_length=32)
    
    """
    	orm中如何定义三种关系
    		publish = models.ForeignKey(to='Publish')
    		
    		authors = models.ManyToManyField(to='Author')
    		
    		author_detail = models.OneToOneField(to='AuthorDetail')
    		
    		
    		ForeignKey
    		OneToOneField
    		会自动在字段后面加_id后缀
    """
    
    # 在django1.X版本中外键默认都是级联更新删除的
    
    """
    一对多
    	models.ForeignKey(to='关联表名')  常用
    	models.ForeignKey(to=关联表名)  	关联表名必须出现在上方(了解即可)
    		1.在django1.X版本中外键默认就是级联更新删除的
    		2.会自动给字段加_id后缀 无论你有没有加(自己不要自作聪明的加上)
    		3.一对多 外键字段建在多的一方
    		
    一对一
    	models.OneToOneField(to='关联表名')
    		1.在django1.X版本中外键默认就是级联更新删除的
    		2.会自动给字段加_id后缀 无论你有没有加(自己不要自作聪明的加上)
    		3.外键建在任意一方均可 但是推荐你建在查询频率较高的表中(orm查询方便)
    		
    多对多
    	models.ManyToManyField(to='关联表名')
    		1.在django1.X版本中外键默认就是级联更新删除的
    		2.该字段是一个虚拟字段不会真正的在表中展示出来 而是用来告诉Django orm当前表和关联表是多对多的外键关系 需要自动创建第三张关系表
    		3.在Django orm中多对多的表关系有好几种(三种)创建方式
    		4.外键建在任意一方均可 但是推荐你建在查询频率较高的表中(orm查询方便)
    		
    判断表关系的方式:换位思考
    """
    

    django请求生命周期流程图(必会)

    """
    浏览器
    	发送请求(HTTP协议)
    
    web服务网关接口
    	1.请求来的时候解析封装
    		响应走的时候打包处理
    
    	2.django默认的wsgiref模块不能承受高并发 最大只有1000左右
    		上线之后会替换成uwsgi来增加并发量
    	
    	3.WSGI跟wsgiref和uwsgi是什么关系
    		WSGI是协议
    		wsgiref和uwsgi是实现该协议的功能模块
    
    django后端
    	1.django中间件(暂时不考虑 后面讲)
    		类似于django的保安 门户
    		
    	2.urls.py  路由层
    		识别路由匹配对应的视图函数
    	
    	3.views.py	视图层
    		网站整体的业务逻辑
    		
    	4.templates文件夹		模版层
    		网站所有的html文件
    	
    	5.models.py				模型层
    		ORM
    """
    # 扩展知识点
    	"""
    	缓存数据库
    		提前已经将你想要的数据准备好了 你来直接拿就可以
    		提高效率和响应时间
    		
    	当你在修改你的数据的时候 你会发现数据并不是立刻修改完成的
    	而是需要经过一段时间才会修改
    		博客园
    	"""
    

    路由层

    路由匹配

    # 路由匹配
    url(r'test',views.test),
    url(r'testadd',views.testadd)
    """
    url方法第一个参数是正则表达式
    	只要第一个参数正则表达式能够匹配到内容 那么就会立刻停止往下匹配
    	直接执行对应的视图函数
    
    你在输入url的时候会默认加斜杠
    	django内部帮你做到重定向
    		一次匹配不行
    		url后面加斜杠再来一次
    """
    # 取消自动加斜杠
    APPEND_SLASH = False/True	# 默认是自动加斜杠的
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        # 首页
        url(r'^$',views.home),
        # 路由匹配
        url(r'^test/$',views.test),
        url(r'^testadd/$',views.testadd),
        # 尾页(了解)
        url(r'',views.error),
    ]
    

    无名分组

    """
    分组:就是给某一段正则表达式用小括号扩起来
    """
    url(r'^test/(d+)/',views.test)
    
    def test(request,xx):
        print(xx)
        return HttpResponse('test')
      
    # 无名分组就是将括号内正则表达式匹配到的内容当作位置参数传递给后面的视图函数
    

    有名分组

    """
    可以给正则表达式起一个别名
    """
    url(r'^testadd/(?P<year>d+)',views.testadd)
    
    def testadd(request,year):
        print(year)
        return HttpResponse('testadd')
    
    # 有名分组就是将括号内正则表达式匹配到的内容当作关键字参数传递给后面的视图函数
    

    无名有名是否可以混合使用

    """
    不能混用  但是同一个分组可以使用N多次
    """
    # 单个的分组可以使用多次
    url(r'^index/(d+)/(d+)/(d+)/',views.index),
    url(r'^index/(?P<year>d+)/(?P<age>d+)/(?P<month>d+)/',views.index),
    

    反向解析

    # 通过一些方法得到一个结果 该结果可以直接访问对应的url触发视图函数
    
    # 先给路由与视图函数起一个别名
    	url(r'^func_kkk/',views.func,name='ooo')
    # 反向解析
    	# 后端反向解析
      	from django.shortcuts import render,HttpResponse,redirect,reverse
      	reverse('ooo')
      # 前端反向解析
      	<a href="{% url 'ooo' %}">111</a>
    
    [26/May/2020 21:04:59] "GET / HTTP/1.1" 200 1338
    1
    [26/May/2020 21:05:02] "GET /edit/?book_id=1 HTTP/1.1" 200 1070
    <QuerySet [<Book: Book object>]>
    1
    <QuerySet [<Book: Book object>]>
    1
    <QuerySet [<Book: Book object>]>
    20000
    [26/May/2020 21:05:11] "POST /edit/?book_id=1 HTTP/1.1" 302 0 
    或者 form表单action默认不写 就不用?了
    [26/May/2020 21:05:11] "GET / HTTP/1.1" 200 1332
    
    
  • 相关阅读:
    RESTful 、RESTful API 、REST 介绍
    微服务 第三章:SpringBoot 创建web项目(调用jsp)
    微服务 第二章:SpringBoot 创建web项目(用Thymeleaf模板引擎)
    SpringBoot学习之 Thymeleaf
    Junit测试
    ---run-pat 测试 crontab 命令
    ---iproute2 策略路由
    ---曾经整混的两个词
    ---Under Ubuntu 14.04
    ---Ubuntu 14.04 虚拟机器和主机时间同步
  • 原文地址:https://www.cnblogs.com/pythonwl/p/12968882.html
Copyright © 2011-2022 走看看