django关系映射2request中的方法

  1. CRUD

    1. 查询
      1. 带条件的查询
        Entry.objects.filter(条件)
        1. Author.objects.filter(id=1)
        2. 查询谓词 : __查询谓词
        __exact :
        __contains :
        __startswith :
        __endswith :
        … …

         	示例:
         		Author.objects.filter(name__startswith='王')
        
      2. Entry.objects.exclude(条件)
        只做不等值

      3. Entry.objects.get(条件)
        特点:只返回一条数据时使用

    2. 修改
      1. 修改单条数据
        1.查 2.改 3.保存
      2. 批量数据
        QuerySet 的 update()
    3. 删除
      delete()
  2. F() 和 Q()

    1. F()
      运行过程中获取某列的值
      F(‘列名’)
      Author.objects.update(age=F(‘age’)+10)
    2. Q()
      Q(条件1)|Q(条件2)
  3. 原生的数据库操作方法

    1. 查询
      Entry.objects.raw(‘sql’)
    2. 增删改
      with connection.cursor() as cursor:
      cursor.execute(‘sql’)
      return ‘’
  4. 后台

    1. 创建后台管理员
      python3 manage.py createsuperuser

    2. 基本管理

      1. admin.py 中注册要管理的实体
        admin.site.register(Entry)

      2. 定义Models的展现形式

        1. 重新定义 str()
          class Author(models.Model):

           def __str__(self):
           	return self.xx
          
        2. 通过verbose_name修改显示的字段名

        	name = models.CharField(
        		max_length=30,
        		verbose_name = "姓名"
        	)
        
        1. 通过Meta内部类
          	class Meta:
          		1.db_table
          			指定当前实体类对应的表名
          			(设置完成后马上同步数据库)
          		2.verbose_name
          			在实体类中的显示名(单数)
          		3.verbose_name_plural
          			效果同上(复数)
          
    3. 高级管理
      1.声明并注册高级管理类\

      	class EntryAdmin(admin.ModelAdmin):
      		pass
      	admin.site.register(Entry,EntryAdmin)
      

      2.在EntryAdmin中实现的高级管理功能
      1.list_display
      2.list_display_links
      3.list_editable
      4.list_filter
      5.search_field
      6.date_hierarchy
      7.fields
      8.fieldsets
      ===================================================

关系映射

  1. 一对一映射

    1. 语法
      在关联的两个类中的任何一个类中:
      属性 = models.OneToOneField(Entry)
    2. 示例
       class Author(models.Model):
       	xxx xxx
       
       class Wife(models.Model):
       	xxx xxx
       	#增加一对一
       	author=models.OneToOneField(Author)
      

    ``

    • 练习:
      1.创建一个Wife类,属性如下
      1.name , 2.age
      2.在Wife类中增加一对一关联关系,引用 Author
      3.同步回数据库并观察结果
    1. 查询
      在 Wife 中,通过 author 属性找到对应的author对象
      在 Author 中,通过 wife 属性找到对应的wife对象
  2. 一对多映射

    1. 语法
      在"多"实体中,对"一"的实体进行引用
      属性 = models.ForeignKey(Entry)

    2. 示例
      一个出版社允许出版多本图书
      一本图书只能属于一个出版社
      class Publisher(models.Model):
      xxx xxx

      class Book(models.Model):
      xxx xxx
      publisher = models.ForeignKey(Publisher,null=True)

      • 练习:
        1.完成Book 和 Publisher 之间的一对多
        2.查看数据库效果
        3.登录到后台,查看Book实体
    3. 数据查询

      1. 通过 Book 查询 Publisher
        通过 publisher 属性查询即可
        练习:
        查询 西游记 对应的出版社信息,打印在终端上
      2. 通过 Publisher 查询 对应的所有的 Books
        Django会在Publisher中增加一个属性来表示对对应的Book们的查询引用
        属性:book_set (Entry.objects)
  3. 多对多映射
    1.语法
    在关联的两个类中的任意一个类中,增加:
    属性 = models.ManyToManyField(Entry)
    2.示例
    一个作者可以出版多本图书
    一本图书可以被多名作者同时编写

     class Author(models.Model):
     	xxxx xxxx
    
     class Book(models.Model):
     	xxxx xxxx
    
     	authors = models.ManyToManyField(Author)
    
    1. 数据查询
      1.通过 Book 查询对应的所有的 Authors
      可以通过authors表示对应所有Author的查询对象

       book.authors.all() -> 获取 book 对应的所有的author的信息
      
       book.authors.filter(age__gt=80) -> 获取book对应的作者中年龄大于80岁的作者的信息
      

      2.通过 Author 查询对应的所有的Books
      Django会生成一个属性 book_set 用于表示对对应的book的查询对象

       author.book_set.all()
       author.book_set.filter()
      
  4. request - 请求对象

    1. 什么是request
      HttpRequest , 在Django中就是请求对象,默认会被封装到视图处理函数的参数中 - request

    2. request中的成员

      1. request.scheme : 请求协议
      2. request.body : 请求主体(POST,PUT)
      3. request.path : 请求的具体资源路径
      4. request.get_full_path : 请求的完整路径
      5. request.get_host() : 请求的主机
      6. request.method : 请求方式
      7. request.GET : get请求方式中封装的数据
      8. request.POST : post请求方式中封装的数据
      9. request.COOKIES : 请求中的cookies的相关数据
      10. request.META : 请求中的元数据(消息头)
        request.META[‘HTTP_REFERER’] : 请求源地址
    3. request.method
      使用:判断 request.method 值,分析用户的请求意图

      if request.method == 'GET':
      	去往指定的模板进行显示
      else:
      	接收请求提交的数据
      
      
    4. 获取请求提交的数据

      1. 使用get方式

        1. 语法
          request.GET[‘参数名’]
          request.GET.get(‘参数名’,‘默认值’)
          request.GET.getlist(‘参数名’)
        2. 能够产生get请求方式的场合
          1. 地址栏的请求
            1. <a href="地址?参数=值&参数=值">
            2. location.href=‘地址?参数=值&参数=值’
          2. 表单中的method为get
            <form method='get'>
            	姓名:<input type="text" name="uname">
            </form>```
            
          • 注意:
          	url(r'^01-xxx/(\d{4})/$',request_views),
          	def request_views(request):
          		request.GET['']
          
          
      2. 使用post方式

        1. 语法
          request.POST[‘参数名’]
          request.POST.get(‘参数名’,’’)
          request.POST.getlist(‘参数名’)
        2. CSRF验证
          CSRF
          Cross-Site Request Forgey
          跨 站点 请求 伪装
          解决方案:
          1. 取消 csrf 验证(不推荐)
          删除 settings.py 中 MIDDLEWARE 中的 CsrfViewsMiddleWare 的中间件
          2. 开放验证
          在视图处理函数增加 : @csrf_protect
          @csrf_protect
          def post_views(request):
          pass
          3. 通过验证
          需要在表单中增加一个标签
          {% csrf_token %}
        • 练习:果园项目的注册部分
          1.创建一个数据库 - FruitDay
          2.创建实体类 - Users
          1.uphone - varchar(11)
          2.upwd - varchar(50)
          3.uemail - varchar(245)
          4.uname - varchar(20)
          5.isActive - tinyint 默认值为1 (True)
          3.完善注册 - /register/
          1.如果是get请求,则去往register.html
          2.如果是post请求,则处理请求数据
          将提交的数据保存回数据库
  • request的方法有以下列表
  • [‘COOKIES’, ‘FILES’, ‘GET’, ‘META’, ‘POST’, ‘class’, ‘delattr’, ‘dict’, ‘dir’, ‘doc’, ‘eq’, ‘format’, ‘ge’, ‘getattribute’, ‘gt’, ‘hash’, ‘init’, ‘iter’, ‘le’, ‘lt’, ‘module’, ‘ne’, ‘new’, ‘reduce’, ‘reduce_ex’, ‘repr’, ‘setattr’, ‘sizeof’, ‘str’, ‘subclasshook’, ‘weakref’, ‘_encoding’, ‘_get_post’, ‘_get_raw_host’, ‘_get_scheme’, ‘_initialize_handlers’, ‘_load_post_and_files’, ‘_mark_post_parse_error’, ‘_messages’, ‘_post_parse_error’, ‘_read_started’, ‘_set_post’, ‘_stream’, ‘_upload_handlers’, ‘body’, ‘build_absolute_uri’, ‘close’, ‘content_params’, ‘content_type’, ‘csrf_processing_done’, ‘encoding’, ‘environ’, ‘get_full_path’, ‘get_host’, ‘get_port’, ‘get_raw_uri’, ‘get_signed_cookie’, ‘is_ajax’, ‘is_secure’, ‘method’, ‘parse_file_upload’, ‘path’, ‘path_info’, ‘read’, ‘readline’, ‘readlines’, ‘resolver_match’, ‘scheme’, ‘session’, ‘upload_handlers’, ‘user’, ‘xreadlines’]
    ···
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值