一、一大波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)

补充:浏览器默认错误提示屏蔽的方法,是form里加的参数novalidate="novalidate"。

python自动开发之第二十三天(Django)的更多相关文章

  1. python自动开发之第二十四天(Django)

    一.ModelForm操作及验证 1.class Meta:class Meta: #注意以下字段不能加逗号 model = models.UserInfo #这里的all代指所用的字段,也可以是一个 ...

  2. 【Python之路】第二十三篇--Django【进阶篇】

    文件配置 1.模版Templates文件配置: TEMPLATE_DIRS = ( os.path.join(BASE_DIR,'templates'), ) 2.静态文件static配置: STAT ...

  3. python自动开发之第二十二天

    知识点概要 - Session - CSRF - Model操作 - Form验证(ModelForm) - 中间件 - 缓存 - 信号 一. Session 基于Cookie做用户验证时:敏感信息不 ...

  4. python自动开发之第十三天

    1.Paramiko模块下的demo.py程序     前面利用Python中的Paramiko模块可以进行SSH的连接,以及用来传送文件(SFTP),但是无论是哪一种方式,连接都是短暂的,并非是长连 ...

  5. python自动开发之第二十五天

    一.组合搜索 参考: http://www.cnblogs.com/ccorz/p/5985205.html 二.JSONP 1.在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,但 ...

  6. Python开发【第二十三篇】:持续更新中...

    Python开发[第二十三篇]:持续更新中...

  7. Python之路【第二十三篇】:Django 初探--Django的开发服务器及创建数据库(笔记)

    Django 初探--Django的开发服务器及创建数据库(笔记) 1.Django的开发服务器 Django框架中包含一些轻量级的web应用服务器,开发web项目时不需再对其配置服务器,Django ...

  8. python自动开发之(算法)第二十七天

    1.什么是算法? 算法(Algorithm):一个计算过程,解决问题的方法 2.复习:递归 递归的两个特点:(1) 调用自身 (2)结束条件 def func1(x): print(x) func1( ...

  9. 第十七章:Python の Web开发基础(四) MVC与Django

    本課主題 MVC 介绍 Django 介紹 MVC 介绍 controllers 处理用户请求 views 放置HTML模版 models 操作数据库 MVC框架就是目录的归类 MVC 是一种软件开发 ...

随机推荐

  1. MyBatis原理简介

    1.什么是 MyBatis ? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyB ...

  2. WPF绑定到父元素的属性的方法

    应用:绑定到父元素的属性上的方法,看图.

  3. BZOJ 1025 游戏(分组背包)

    题目所谓的序列长度实际上就是各循环节的lcm+1. 所以题目等价于求出 一串数之和等于n,这串数的lcm种数. 由唯一分解定理可以联想到只要把每个素数的幂次放在一个分组里,然后对整体做一遍分组背包就行 ...

  4. hadoop MapReduce辅助排序解析

    1.数据样本,w1.csv到w5.csv,每个文件数据样本2000条,第一列是年份从1990到2000随机,第二列数据从1-100随机,本例辅助排序目标是找出每年最大值,实际上结果每年最大就是100, ...

  5. 蒟蒻Orion还要学的东西!

    这个ID多元化真是个麻烦的事情...... 一会KamijouIndex一会dedicatus545一会Orion的,乱死了啊啊啊啊 数据结构 圆方树 ETT 仙人掌 可持久化树套树 数学 洲阁筛 m ...

  6. CF449C:Jzzhu and Apples——题解

    https://vjudge.net/problem/CodeForces-449C 题目大意:1-n编号的苹果两两一对,他们的最大公约数不为1,求这些对的最大匹配. ———————————————— ...

  7. 牛客网 Wannafly挑战赛27 蓝魔法师

    蓝魔法师 链接: https://www.nowcoder.com/acm/contest/215/C 来源:牛客网 题目描述 "你,你认错人了.我真的,真的不是食人魔."--蓝魔 ...

  8. HDOJ(HDU).1241 Oil Deposits(DFS)

    HDOJ(HDU).1241 Oil Deposits(DFS) [从零开始DFS(5)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架 ...

  9. Mac添加锁屏快捷键

    Mac要想添加锁屏快捷键,必须使用Automator. 1. 打开Automator,创建一个新的服务. 2. 在左侧栏中找到 启动屏幕保护 ,将其拖曳到右侧窗口内,并且修改 服务收到改为" ...

  10. LibreOJ #6221. 幂数 !(数论+dfs+剪枝)

    写新题然后艹翻标程的感觉真是舒爽啊... 这题就是个dfs...先预处理出sqrt(n)范围内的素数,然后dfs构造合法的数就行了. 直接暴搜会TLE,需要剪一剪枝,不需要跑到最后一层再计算答案,边构 ...