一、一大波model操作

1. 创建数据库表
  # 单表
    # app01_user ==> tb1
    # users
    class User(models.Model):
      name = models.CharField(max_length=32)
      pwd = models.CharField(max_length=32)

      class Meta:
      # 数据库中生成的表名称 默认 app名称 + 下划线 + 类名
        db_table = "tb1"

        index_together = [
          ("name", 'pwd'),
        ]
    # 最左前缀的模式:
    # select * from where name='xx'
    # select * from where name='xx' and email = 'xx'
    # select * from where email = 'xx' # 无法命中索引

  unique_together = (("driver", "restaurant"),)

  verbose_name = “上课记录”
  verbose_name_plural=““上课记录””

  # 一对多/一对一/多对多

  一对多:
    def func():
      return 5

    class UserType(models.Model):
      name = models.CharField(max_length=32)

    class User(models.Model):
      name = models.CharField(max_length=32)
      pwd = models.CharField(max_length=32)
      .... ForiegnKey(to="UserType",to_field='id',on_delete=models.SET(func))

    # delete from user where id=1
    # delete from UserType where id=1 # 报错

    # UserType.objects.filter(id=1).delete()

  # 正向
    # v = User.objects.all()
    # for item in v:
      # item.user
      # item.pwd
      # item.ut.name

    # User.objects.all().values('user','ut__name')

  # 反向
    # v = UserType.objects.all()
    # for item in v:
      # item.name
      # item.id
      # item.user_set.all() # item.b.all()

  # models.UserType.objects.all().values('name','user__pwd')

  多对多:
    a. django创建第三张表
      m2m.remove
      m2m.add
      m2m.set
      m2m.clear
      m2m.filter()
    b. 自定义第三张表(无m2m字段)

      自己链表查询

    c. 自定义第三张表(有m2m字段)
      # 通过m2m字段查操作
      # 通过m2m字段 clear

  2. 操作数据库表
    - 基本操作
    - QuerySet中的方法:
    - 返回QuerySet类型(select_related,prefetch_related)

  select_related
    users = models.User.objects.all().select_related('ut')
    for row in users:
      print(row.user,row.pwd,row.ut_id)
      print(row.ut.name)
      print(row.tu.name) # 再发起一次SQL请求

  prefetch_related
    users = models.User.objects.filter(id__gt=30).prefetch_related('ut','tu')
    # select * from users where id > 30
    # 获取上一步骤中所有的ut_id=[1,2]
    # select * from user_type where id in [1,2]
    # select * from user_type where id in [1,2]

    for row in users:
      print(row.user,row.pwd,row.ut_id)
      print(row.ut.name)

  3. 数据验证(弱)

    full_clean进行验证
      - 每个字段的正则
      - clean钩子

二、Form操作
  数据验证(强大)

    1、Form操作基础回顾

      验证和生成HTML

      新URL方式时,用验证和生成html功能

      ajax方式时,可以只用验证

    2、动态的获取数据库的数据(select)

      (1)其中一种写法

      

      

      (2)重写构造来实现的方法

      

      

      (3)针对choices的写法,构造方法

      

     (4)ModelChoicesField方法

      

      

      注:这个需要models里面,自己定制__str__

      

      如果没有的话页面上看到的就是如下

      

  3、内置钩子

    (1)字段的验证

      _clean_field

      

      

      注:必须要有返回值

      

    (2)整体进行验证,例如user和pwd整体验证(用户登录时)

      _clean_form

      

    (3)_post_clean

      

    

    总结:is_valid-->self.errors-->full_clean-->clean_field,clean_form,post_clean

      - 每一个字段(正则,字段钩子)
      - clean
      - _post_clean
      _cleand的错误信息都放在:__all__

      

      

三、序列化操作

  对ErrorDict序列化
    - 自定义encoder

    

  对QuerySet进行序列化
  第一种(Django提供得自身模块):
    from django.core import serializers

    v = models.tb.objects.all()
    data = serializers.serialize("json", v)

  第二种(控制每一行是字典):

  import json
  from datetime import date
  from datetime import datetime
  #如果遇到datime就得自定制
  class JsonCustomEncoder(json.JSONEncoder):

    def default(self, field):

    if isinstance(field, datetime):
      return field.strftime('%Y-%m-%d %H:%M:%S')
    elif isinstance(field, date):
      return field.strftime('%Y-%m-%d')
    else:
      return json.JSONEncoder.default(self, field)
  

  #内部是字典,外部是Queryset
  v = models.tb.objects.values('id','name','ctime')

  #转换成列表
  v = list(v)
  v = json.dumps(v,cls=JsonCustomEncoder)

Django(六)的更多相关文章

  1. django(六):view和cbv

    FBV即以函数的形式实现视图函数,CBV即以类的形式实现视图函数:相比而言,CBV根据请求方式书写各自的代码逻辑,结构清晰明了,但是由于多了一层反射机制,性能要差一些:FBV执行效率要高一些,但是代码 ...

  2. Django 六——自定义标签、图片验证码、发送邮件、评论树、组合搜索

    1.自定义标签 2.图片验证码 3.生成邮箱验证码.发送邮件 4.评论树实现 5.组合搜索(Q) 1.自定义标签 配置: a.在app中新建文件夹  templatetags,里面新建  xx.py文 ...

  3. Django (六) 视图 views

    views 1. 视图及HttpRequest 和HttpResponse Django中的视图主要用来接受Web请求,并做出响应. 视图的本质就是一个Python中的函数 视图的响应分为两大类 1) ...

  4. Django进入监听端口就自动打开指定页面,无需导航栏手动添加(Django六)

    在我们进入监听端口时画面如下:而因为在urls.py中写过如下语句 我们在监听端口后加上/login就会跳转到login.html页面,如下图 那么如何一打开监听端口就可以走动跳转到login.htm ...

  5. 基于Nginx和uWSGI在Ubuntu上部署Django项目

    前言: 对于做Django web项目的童鞋,重要性不言而喻. 参考:https://www.cnblogs.com/alwaysInMe/p/9096565.html https://blog.cs ...

  6. Nginx+uwsgi安装配置

    一.安装基础开发包 yum groupinstall "Development tools" yum install zlib-devel bzip2-devel pcre-dev ...

  7. centos 6.x 部署uwsgi+flask项目

    一.项目背景 1. 公司需求要做一个在线统计页面; 2. 统计在线人数,进行人数数据展示; 3. 类似QQ官网在线人数 二.测试环境 [root@linux-node2 ~]# cat /etc/*r ...

  8. drf框架 - 三大认证组件 | 认证组件 | 权限组件 | 频率组件

    RBAC 基于用户权限访问控制的认证 - Role-Based Access Control Django框架采用的是RBAC认证规则,RBAC认证规则通常会分为 三表规则.五表规则,Django采用 ...

  9. 利用django创建一个投票网站(六)

    建你的第一个 Django 项目, 第六部分 这一篇从第五部分(zh)结尾的地方继续讲起.再上一节中我们为网络投票程序编写了测试,而现在我们要为它加上样式和图片. 除了服务端生成的 HTML 以外,网 ...

  10. Python之路【第十六篇】:Django【基础篇】

    Python之路[第十六篇]:Django[基础篇]   Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...

随机推荐

  1. springboot的登录拦截机制

    转自:https://blog.csdn.net/qq_26555463/article/details/78296103 如果是一个后台的管理项目的,有些东西是不能直接就可以访问的,必须要登录才可以 ...

  2. 第11课 Git GUI程序的基本功能

    11-1 Git GUI程序的基本操作

  3. Rocky(模拟)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2718 题意:如果没有障碍就按原方向直走,否则就 ...

  4. 服务器通信REST、gRPC,Swagger/OpenAPI

    服务间的通信方式是在采用微服务架构时需要做出一个最基本的决策.默认的选项是通过 HTTP 发送 JSON,也就是所谓的 REST API.我们也是从 REST 开始的,但最近我们决定改用 gRPC. ...

  5. cocos creator制作微信小游戏

    2019-05-30 22:11:47 基础: javaScript基础   https://www.bilibili.com/video/av34087791?from=search&sei ...

  6. Eclipse 每次ctrl-c ctrl-v 就变慢?

    继续闲着,所以继续写 大小: 60.7 KB 查看图片附件

  7. JWPL工具处理维基百科wikipedia数据用于NLP

    JWPL处理维基百科数据用于NLP 处理zhwiki JWPL是一个Wikipedia处理工具,主要功能是将Wikipedia dump的文件经过处理.优化导入mysql数据库,用于NLP过程.以下以 ...

  8. Linux学习自动化脚本(一)

    https://www.cnblogs.com/handsomecui/p/5869361.html https://blog.csdn.net/daigualu/article/details/76 ...

  9. C# 根据空格数截取

    #region --根据空格数截取 ; ; //循环截取 , }; while (!sr.EndOfStream) { ; i < strTest.Length - ; i++) { ).Tri ...

  10. vue-路由使用

    路由安装 终端下载路由插件 npm install vue-router --save-dev 配置 在main.js中引入插件 //Router 为自定义名 vue-router 为插件的名字 im ...