day23
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了day23相关的知识,希望对你有一定的参考价值。
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. 数据验证(强大)
- 每一个字段(正则,字段钩子)
- clean
- _post_clean
对于错误信息:__all__
四、序列化操作
ErrorDict
- 自定义encoder
QuerySet
第一种:
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
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)
v = models.tb.objects.values(‘id‘,‘name‘,‘ctime‘)
v = list(v)
v = json.dumps(v,cls=JsonCustomEncoder)
作业:
1. 主站
2. 个人站点
3. 后台管理
=> 登录、注册(Ajax+Form验证)
=> 个人博客注册
=> 标签
=> 分类操作
三、ModelForm
1. 数据库操作
2. 数据验证
==》
- 小型
- 自定制admin
五、Ajax操作
- 原生ajax
- 跨域请求(jsonp,CORS)
- Ajax上传文件(2种)
六、验证码(session实现验证码)
以上是关于day23的主要内容,如果未能解决你的问题,请参考以下文章