一、一大波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. Codeforces--630C--Lucky Numbers(快速幂)

     C - Lucky Numbers Crawling in process... Crawling failed Time Limit:500MS     Memory Limit:65536K ...

  2. Node.js+express 4.x 入门笔记

    一.新建node项目并实现访问 二.在express4.x下,让ejs模板文件,使用扩展名为html的文件 三.实现路由功能 四.session使用 五.页面访问控制及提示 六.代码下载地址 一.新建 ...

  3. 实体 和 XML格式的转换

    许多接口传输需要XML格式转换,那么如何实现?看下面帮助类→_→ /// <summary> /// XML处理帮助类,编码格式GBK!! /// </summary> pub ...

  4. .htaccess的基本用法与介绍

    ●自定义错误页 .htaccess的一个应用是自定义错误页面,这将使你可以拥有自己的.个性化的错误页面(例如找不到文件时),而不是你的服务商提供的错误页或没有任何页面.这会让你的网站在出错的时候看上去 ...

  5. js date 转化为字符串函数

    getDate() 从 Date 对象返回一个月中的某一天 (1 ~ 31). getDay() 从 Date 对象返回一周中的某一天 (0 ~ 6). getFullYear() 从 Date 对象 ...

  6. 推荐几个好用的windows软件

    好久没上了,= = 之前用了一段MAC,感觉好用的地方就是 spotlight和触摸板,哈哈 然后在用回windows之后就找了一下,我之前有用Launchy这个软件,但是他是用来启动程序的,当然你也 ...

  7. Matlab数组创建

    只用C语言,不用Matlab这种魔咒还是要打破的.Matlab是科学计算的常用工具,既然以前没用过,现在开始学吧...... 1.   向量的创建 1)直接输入: 行向量:a=[1,2,3,4,5] ...

  8. HDU_1850_nim游戏

    Being a Good Boy in Spring Festival Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32 ...

  9. js获取当前具体时间

    /** * 获取当前时间 * @param isTime true:显示日期和时间,如:2018-09-20 13:25:12:false:显示日期,如:2018-09-20. * @returns ...

  10. Bem命名

    BEM思想 1. 什么是BEM: BEM:(Block块,Element元素,Modifier修饰符)一种命名规范, 其核心思想是将页面拆分成一个个独立的富有语义的块(blocks),从而使得团队在开 ...