python自动开发之第二十三天(Django)
一、一大波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)的更多相关文章
- python自动开发之第二十四天(Django)
一.ModelForm操作及验证 1.class Meta:class Meta: #注意以下字段不能加逗号 model = models.UserInfo #这里的all代指所用的字段,也可以是一个 ...
- 【Python之路】第二十三篇--Django【进阶篇】
文件配置 1.模版Templates文件配置: TEMPLATE_DIRS = ( os.path.join(BASE_DIR,'templates'), ) 2.静态文件static配置: STAT ...
- python自动开发之第二十二天
知识点概要 - Session - CSRF - Model操作 - Form验证(ModelForm) - 中间件 - 缓存 - 信号 一. Session 基于Cookie做用户验证时:敏感信息不 ...
- python自动开发之第十三天
1.Paramiko模块下的demo.py程序 前面利用Python中的Paramiko模块可以进行SSH的连接,以及用来传送文件(SFTP),但是无论是哪一种方式,连接都是短暂的,并非是长连 ...
- python自动开发之第二十五天
一.组合搜索 参考: http://www.cnblogs.com/ccorz/p/5985205.html 二.JSONP 1.在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的,但 ...
- Python开发【第二十三篇】:持续更新中...
Python开发[第二十三篇]:持续更新中...
- Python之路【第二十三篇】:Django 初探--Django的开发服务器及创建数据库(笔记)
Django 初探--Django的开发服务器及创建数据库(笔记) 1.Django的开发服务器 Django框架中包含一些轻量级的web应用服务器,开发web项目时不需再对其配置服务器,Django ...
- python自动开发之(算法)第二十七天
1.什么是算法? 算法(Algorithm):一个计算过程,解决问题的方法 2.复习:递归 递归的两个特点:(1) 调用自身 (2)结束条件 def func1(x): print(x) func1( ...
- 第十七章:Python の Web开发基础(四) MVC与Django
本課主題 MVC 介绍 Django 介紹 MVC 介绍 controllers 处理用户请求 views 放置HTML模版 models 操作数据库 MVC框架就是目录的归类 MVC 是一种软件开发 ...
随机推荐
- POJ3621:Sightseeing Cows——题解
http://poj.org/problem?id=3621 全文翻译参自洛谷:https://www.luogu.org/problemnew/show/P2868 题目大意:一个有向图,每个点都有 ...
- POJ2828:Buy Tickets——题解
http://poj.org/problem?id=2828 首先发现如果我们按照他的方法模拟的话,势必时间爆炸. 所以我们从后往前推,因为我们知道最后一个的位置一定是对的,而前面的位置可以从后面推知 ...
- POJ3678:Katu Puzzle——题解
http://poj.org/problem?id=3678 总觉得这题比例题简单. 设a为x取0的点,a+n为x取1的点. 我们还是定义a到b表示取a必须取b. 那么我们有: 当AND: 1.当c= ...
- BZOJ5301:[CQOI2018]异或序列——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5301 https://www.luogu.org/problemnew/show/P4462 已知 ...
- BZOJ2693:JZPTAP——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2693 Description Input 一个正整数T表示数据组数 接下来T行 每行两个正整数 ...
- [Leetcode] word search 单词查询
Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...
- SP7586 NUMOFPAL - Number of Palindromes 解题报告
SP7586 NUMOFPAL - Number of Palindromes 题意翻译 求一个串中包含几个回文串 输入输出格式 输入格式: The string S. 输出格式: The value ...
- CodeForces - 50A Domino piling (贪心+递归)
CodeForces - 50A Domino piling (贪心+递归) 题意分析 奇数*偶数=偶数,如果两个都为奇数,最小的奇数-1递归求解,知道两个数都为1,返回0. 代码 #include ...
- 两年Java的面试经验
前言:从过年前就萌生出要跳槽的想法,到过年来公司从3月初提出离职到23号正式离职,上班的时间也出去面试过几家公司,后来总觉的在职找工作总是得请假,便决心离职后找工作.到4月10号找到了一家互联网公司成 ...
- OpenCV学习笔记(01)我的第一个OpenCV程序(环境配置)
昨天刚刚考完编译原理,私心想着可以做一些与考试无关的东西了.一直想做和图像处理相关的东西,趁这段时间有空学习一下OpenCV,搭建环境真是一件麻烦的事情,搞了近三个小时终于OK了.先来张图: 大致描述 ...