目录
- Django ORM 常用字段和参数
- models中的常用字段
- 如何自定义char类型字段
- 字段内的关键字参性参数
- DateField和DateTimeField
- 关系字段
- ForeignKey
- 字段参数
- OneToOneField
- choices参数
- 用户表举例:
- 基本运用
- 数据库查询优化(面试会问)
- only与defer的用法:
- defer的使用:
- selected_related与prefetch_related的用法
- selected_related与prefetch_related的优缺点:
- django orm如何开启事务操作
- 事务的四大特性(ACID)
- 数据库的三大设计范式
- django orm开启事务操作
- 导入模块:
- MTV与MVC模型
- MTV: django号称是MTV框架
- MVC
- 本质
- BMS:
Django ORM 常用字段和参数
models中的常用字段
AutoField(primary_key=True) 主键字段
CharField(max_length=32) varchar(32)
IntegerField() int
BigIntergerField() bigint
DecimalField() decimal
EmailField() varchart(254)
DateField() date
DateTimeField() datetime
auto_now:每次编辑数据的时候都会自动更新该字段时间
auto_now_add:创建数据的时候自动更新
BooleanField(Field)
给该字段传布尔值 会对应成 数字0/1
is_delete
is_status
is_vip
TextField(Field)
- 文本类型
存储大段文本
FileField(Field)
- 字符串,路径保存在数据库,文件上传到指定目录,只存文件路径
upload_to = '指定文件路径'
给该字段传文件对象 文件会自动保存到upload_to指定的文件夹下 然后该字段存文件的路径
AutoField
AutoField(primary_key=True) 主键字段
int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。
CharField
CharField(max_length=32) varchar(32)
字符类型,必须提供max_length参数, max_length表示字符长度。
这里需要知道的是Django中的CharField对应的MySQL数据库中的varchar类型,没有设置对应char类型的字段,但是Django允许我们自定义新的字段,下面我来自定义对应于数据库的char类型
自定义字段在实际项目应用中可能会经常用到,这里需要对他留个印象
from django.db import models
# Create your models here.
#Django中没有对应的char类型字段,但是我们可以自己创建
class FixCharField(models.Field):
'''
自定义的char类型的字段类
'''
def __init__(self,max_length,*args,**kwargs):
self.max_length=max_length
super().__init__(max_length=max_length,*args,**kwargs)
def db_type(self, connection):
'''
限定生成的数据库表字段类型char,长度为max_length指定的值
:param connection:
:return:
'''
return 'char(%s)'%self.max_length
#应用上面自定义的char类型
class Class(models.Model):
id=models.AutoField(primary_key=True)
title=models.CharField(max_length=32)
class_name=FixCharField(max_length=16)
gender_choice=((1,'男'),(2,'女'),(3,'保密'))
gender=models.SmallIntegerField(choices=gender_choice,default=3)
IntegerField
IntegerField() int
一个整数类型,范围在 -2147483648 to 2147483647。(一般不用它来存手机号(位数也不够),直接用字符串存,)
BigIntergerField
BigIntergerField() bigint
长整型(有符号的) -9223372036854775808 ~ 9223372036854775807
DecimalField
DecimalField() decimal
- 10进制小数
- 参数:
max_digits,小数总长度
decimal_places,小数位长度
EmailField
EmailField() varchart(254)
字符串类型,Django Admin以及ModelForm中提供验证机制
DateField
DateField() date
日期格式 YYYY-MM-DD
DateTimeField
DateTimeField() datetime
auto_now:每次编辑数据的时候都会自动更新该字段时间
auto_now_add:创建数据的时候自动更新
日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。
BooleanField
BooleanField(Field)
BooleanField(Field)
给该字段传布尔值 会对应成 数字0/1
is_delete
is_status
is_vip
TextField
TextField(Field)
- 文本类型
存储大段文本
FileField
FileField(Field)
- 字符串,路径保存在数据库,文件上传到指定目录,只存文件路径
upload_to = '指定文件路径'
给该字段传文件对象 文件会自动保存到upload_to指定的文件夹下 然后该字段存文件的路径
如何自定义char类型字段
from django.db.models import Field
class RealCharField(Field):
def __init__(self,max_length,*args,**kwargs):
self.max_length = max_length # 拦截一个父类的方法 操作完之后 利用super调用父类的方法
super().__init__(max_length=max_length,*args,**kwargs)
def db_type(self, connection):
return 'char(%s)'%self.max_length
class Movie(models.Model):
textField = RealCharField(max_length=64)
效果:
字段内的关键字参性参数
null
default
django 1.x默认就是级联更新级联删除 django2.x需要你自己手动指定
on_delete = models.CASCADE
db_contraints = True
# 百度
null
用于表示某个字段可以为空。
unique
如果设置为unique=True 则该字段在此表中必须是唯一的 。
db_index
如果db_index=True 则代表着为此字段设置索引。
default
为该字段设置默认值。
DateField和DateTimeField
auto_now_add
配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
auto_now
配置上auto_now=True,每次更新数据记录的时候会更新该字段。
关系字段
ForeignKey
外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方。
ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系。
字段参数
to
设置要关联的表
to_field
设置要关联的表的字段
on_delete
当删除关联表中的数据时,当前表与其关联的行的行为。
models.CASCADE
删除关联数据,与之关联也删除
db_constraint
是否在数据库中创建外键约束,默认为True。
代码演示:
def func():
return 10
class MyModel(models.Model):
user = models.ForeignKey(
to="User",
to_field="id",
on_delete=models.SET(func)
)
OneToOneField
to
设置要关联的表。
to_field
设置要关联的字段。
on_delete
当删除关联表中的数据时,当前表与其关联的行的行为。(参考上面的例子)
choices参数
用户表举例:
用户的性别
学历
婚否
在职状态
客户来源
当你的数据能够被你列举完全 你就可以考虑使用choices参数
基本运用
代码:列一
# choices字段
class Userinfo(models.Model):
username = models.CharField(max_length=32)
gender_choices = (
(1,'男'),
(2,'女'),
(3,'其他'),
)
gender = models.IntegerField(choices=gender_choices)
# 该字段还是存数字 并且可以匹配关系之外的数字
咧二
record_choices = (('checked', "已签到"),
('vacate', "请假"),
('late', "迟到"),
('noshow', "缺勤"),
('leave_early', "早退"),
)
record = models.CharField("上课纪录", choices=record_choices, default="checked", max_length=64)
两个列子一样的用法:如下
效果:
向表中添加数据:
先存数据
models.Userinfo.objects.create(username='jason',gender=1)
models.Userinfo.objects.create(username='tank',gender=2)
models.Userinfo.objects.create(username='egon',gender=3)
models.Userinfo.objects.create(username='sean',gender=10)
效果:
获取值:
user_obj = models.Userinfo.objects.get(pk=1)
print(user_obj.username)
print(user_obj.gender)
# 针对choices参数字段 取值的时候 get_xxx_display()
print(user_obj.get_gender_display())
# # 针对没有注释信息的数据 get_xxx_display()获取到的还是数字本身
user_obj = models.Userinfo.objects.get(pk=4)
print(user_obj.gender)
print(user_obj.get_gender_display())
user_obj = models.Userinfo.objects.get(pk=1)
print(user_obj.username)
print(user_obj.gender)
# 针对choices参数字段 取值的时候 get_xxx_display()
print(user_obj.get_gender_display())
效果:
针对没有(pk=4)数据的值
# # 针对没有注释信息的数据 get_xxx_display()获取到的还是数字本身
user_obj = models.Userinfo.objects.get(pk=4)
print(user_obj.gender)
print(user_obj.get_gender_display())
效果:
数据库查询优化(面试会问)
only与defer
selected_related与prefetch_related
惰性查询:
django orm查询都是惰性查询
res = models.Book.objects.all() # django orm查询都是惰性查询
#没有用到res变量名 ,就是惰性查询。
反之:
print(res)
效果:
反之:
only与defer的用法:
noly的使用:
res = models.Book.objects.only('title') # 這些對象内部只有title屬性
# print(res)
for r in res:
# print(r.title)
print(r.price)
# res = models.Book.objects.only('title') # 這些對象内部只有title屬性 存有惰性查询的意思。
# print(res)
效果:
效果:print(r.title)
效果:print(r.price) 走数据库
only作用
only作用
括号内传字段 得到的结果是一个列表套数据对象 该对象内只含有括号内指定的字段属性
对象点该字段属性是不会走数据库的 但是你一旦点了非括号内的字段 也能够拿到数据,但是是重新走的数据库查询吧
defer的使用:
res = models.Book.objects.defer('title') # defer与only互为反关系
print(res)
效果:
res = models.Book.objects.defer('title') # defer与only互为反关系 r点其他数据就不走数据库,就是说除了title数据外其他数据都有,如点title,就会重新走一遍数据库
for r in res:
print(r.title)
效果:r点其他数据,就是说除了title数据外其他数据都有,如点title,就会重新走一遍数据库
defer作用:
defer与only相反
括号内传字段 得到的结果是一个列表套数据对象 该对象内没有括号内指定的字段属性
对象点该字段属性会重复走数据库 但是你一旦点了非括号内的字段 就不走数据库了
selected_related与prefetch_related的用法
selected_related
引子:
# res = models.Book.objects.get(pk=1)
# print(res.publish.name)
效果:
selected_related:
res = models.Book.objects.select_related('publish')
print(res)
效果:
# res = models.Book.objects.select_related('authors')
# for r in res:
# print(r.publish.name)
# print(r.publish.addr)
效果:存放多对多字段报错
效果:不放多对多字段:
selected_related作用
内部是连表操作 现将关系表全部链接起来 之后再一次性查询出来 封装到对象中
数据对象之后在获取任意表中的数据的时候都不需要再走数据库了 因为全部封装成了对象的属性
select_related括号内只能传外键字段 并且不能是多对多字段 只能是一对多和一对一
select_related(外键字段1__外键字段2__外键字段3...)
prefetch_related的使用:
res = models.Book.objects.prefetch_related('publish')
print(res)
效果:
for循环:
res = models.Book.objects.prefetch_related('publish')
for r in res:
print(r.publish.name)
效果:
prefetch_related的作用
prefetch_related内部是子查询 但是给你的感觉是连表操作
内部通过子查询将外键管理表中的数据页全部给你封装到对象中
之后对象点当前表或者外键关联表中的字段也都不需要走数据库了
selected_related与prefetch_related的优缺点:
优点:select_related连表操作 好处在于只走一次sql查询
缺点:耗时耗在 连接表的操作 10s
:prefetch_related子查询 走两次sql查询
耗时耗在 查询次数 1s
django orm如何开启事务操作
事务的四大特性(ACID)
原子性:
原子性(Atomicity),原子意为最小的粒子,即不能再分的事务,要么全部执行,要么全部取消(就像上面的银行例子)
一致性:
一致性(Consistency):指事务发生前和发生后,数据的总额依然匹配
隔离性:
隔离性(Isolation):简单点说,某个事务的操作对其他事务不可见的
持久性:
持久性(Durability):当事务完成后,其影响应该保留下来,不能撤消,只能通过“补偿性事务”来抵消之前的错误
start transaction
rollback
commit
数据库的三大设计范式
第一范式:当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要
求,否则,将有很多基本操作在这样的关系模式中实现不了。
第二范式:如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。
第三范式:设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF.
注:关系实质上是一张二维表,其中每一行是一个元组,每一列是一个属性
django orm开启事务操作
导入模块:
from django.db import transaction
# django orm开启事务操作
from django.db import transaction
with transaction.atomic():
# 在with代码块中执行的orm语句同属于一个事务
pass
# 代码块运行结束 事务就结束了 事务相关的其他配置 你可以百度搜搜看
MTV与MVC模型
MTV: django号称是MTV框架
M 指:models
T :templates
V :views
MVC
M:models
V:views
C:contronnar 控制器(路由分发 urls.py)
本质
本质:MTV本质也是MVC
BMS:
Web领域没有绝对的安全 也没有绝对的不安全