一、一大波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. subprocess模块详解

    subprocess是Python与系统交互的一个库,该模块允许生成新进程,连接到它们的输入/输出/错误管道,并获取它们的返回代码. 该模块旨在替换几个较旧的模块和功能: os.system os.s ...

  2. 【题解】CF#855 G-Harry Vs Voldemort

    个人感觉挺有意思的,然而被颜神D无聊惹(- ̄▽ ̄)- 这题我们可以首先试图去统计以每一个点作为 w 点所能对答案造成的贡献是多少.不难发现,当且仅当 u 和 v 都在 w 所在边双的一侧的时候不能构成 ...

  3. [国家集训队]最长双回文串 manacher

    ---题面--- 题解: 首先有一个直观的想法,如果我们可以求出对于位置i的最长后缀回文串和最长前缀回文串,那么我们枚举分界点然后合并前缀和后缀不就可以得到答案了么? 所以我们的目标就是求出这两个数列 ...

  4. BZOJ2005:[Noi2010]能量采集——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=2005 Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光 ...

  5. HDOJ(HDU).1258 Sum It Up (DFS)

    HDOJ(HDU).1258 Sum It Up (DFS) [从零开始DFS(6)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双 ...

  6. 除了love和hate,还能怎么表达那些年的“爱恨情仇”?

    实用英语 帮你全面提高英语水平 关注 童鞋们每次刷美剧的时候,相信都会被CP感满满的男女主角虐得体无完肤吧. 可是,一到我们自己表达爱意或者恨意的时候,却苦于词穷,只会用love, like, hat ...

  7. Poco::Path 和 DirectoryIterator

    #include<iostream>#include<typeinfo>#include<Poco/Path.h>using namespace std;using ...

  8. Codeforces Round #344 (Div. 2) A

    A. Interview time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  9. Service学习

    一.采用startService方式开启服务 1.写一个服务类 public class PhoneService extends Service { private static final Str ...

  10. 在Linux防火墙上过滤外来的ICMP timestamp

    ICMP timestamp请求响应漏洞 解决方案:  * 在您的防火墙上过滤外来的ICMP timestamp(类型13)报文以及外出的ICMP timestamp回复报文.     具体解决方式就 ...