一、一大波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. Redis 学习之集群

    该文使用centos6.5 64位  redis3.2.8 一.  redis-cluster架构图 集群通信:所有redis节点之间通过PING-PONG机制彼此互联,内部使用二进制鞋子优化传输速度 ...

  2. 【bzoj3524】[Poi2014]Couriers 主席树

    题目描述 给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. 输入 第一行 ...

  3. 【codevs1282】约瑟夫问题 Treap

    题目描述 有编号从1到N的N个小朋友在玩一种出圈的游戏.开始时N个小朋友围成一圈,编号为I+1的小朋友站在编号为I小朋友左边.编号为1的小朋友站在编号为N的小朋友左边.首先编号为1的小朋友开始报数,接 ...

  4. URL 编码规则

    规则: 1.将空格转换为加号(+) 2.对0-9.a-z.A-Z之间的字符保持不变 3.对于所有其他的字符,用这个字符的当前当前字符集编码在内存中的十六进制格式表示,并在每一个字节前加上一个百分号(% ...

  5. hihoCoder#1838 : 鎕鎕鎕 贪心

    ---题面--- 题解: 神奇的贪心题,,,感觉每次做贪心题都无从下手... 我们首先按照a对所有卡片从小到大排序,然后从1开始,从连续的两张牌中取b最大的,最后一张单出来的也取了. 可以证明,这样的 ...

  6. Educational Codeforces Round 6 C

    C. Pearls in a Row time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  7. Codeforces Round #508 (Div. 2) E. Maximum Matching(欧拉路径)

     E. Maximum Matching 题目链接:https://codeforces.com/contest/1038/problem/E 题意: 给出n个项链,每条项链左边和右边都有一种颜色(范 ...

  8. tp查找某字段,排除某字段,不用一次写那么多

    更多的情况下我们都是查询某些字段,但有些情况下面我们需要通过字段排除来更方便的查询字段,例如文章详细页,我们可能只需要排除status和update_time字段,这样就不需要写一堆的字段名称了(有些 ...

  9. Fixed: The Windows Process Activation Service service terminated with the following error: The system cannot find the file specified

    I'm not yet clear what I did, but I'm blogging it so it can be found if someone else has this issue. ...

  10. 在IIS中寄存服务

    http://blog.csdn.net/songyefei/article/details/7381595 第三篇 在IIS中寄宿服务 通过前两篇的学习,我们了解了如何搭建一个最简单的WCF通信模型 ...