一、Django ORM 常用字段和参数
1.常用字段
models中所有的字段类型其实本质就那几种,整形varchar什么的,都没有实际的约束作用,虽然在models中没有任何限制作用,但是还是要分门别类,对于校验性组件校验非常有用
就比如说邮箱类型,你在输入邮箱的时候如果不按照邮箱格式输入,瞎鸡儿输入会提示你不合法,虽然输入的是字符串,但是不是规定的邮箱字符串
AutoField() 【int primary key auto_increment)】 int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。
IntegerField() 【int()】一个整数类型,范围在 -2147483648 to 2147483647。(一般不用它来存手机号(位数也不够),直接用字符串存
CharField() 【varchar()】 字符类型,必须提供max_length参数, max_length表示字符长度。
DateField() 【date】日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例。
DateTimeField() 【datetime】日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例
EmailField() 【varchar(254)】其实就是varchar但是不能直接写成varchar,就比如男人女人都是人,但是必须说清楚,后面会用于校验性组件的校验
BooleanField()
is_delete = BooleanField()
给该字段传值的时候 你只需要传布尔值即可
但是对应到数据库 它存的是0和1
TextField()
- 文本类型用来存大段文本
FileField()
- 字符串,路径保存在数据库,文件上传到指定目录
- 参数:
upload_to = "path" 用户上传的文件会自动放到等号后面指定的文件路径中
storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
自定义char:
Django中的CharField对应的MySQL数据库中的varchar类型,没有设置对应char类型的字段,
但是Django允许我们自定义新的字段,下面我来自定义对应于数据库的char类型
自定义字段在实际项目应用中可能会经常用到
2.字段参数
null 用于表示某个字段可以为空。
unique 如果设置为unique=True 则该字段在此表中必须是唯一的 。
db_index 如果db_index=True 则代表着为此字段设置索引。
default 为该字段设置默认值。
DateField和DateTimeField:
uto_now_add 配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
auto_now 配置上auto_now=True,每次更新数据记录的时候会更新该字段
3.choices字段
在很多时候我们往数据库中存数据的时候不会直接存储汉字,会采用数字存取代替汉字,减小内存,
我们使用choices来给数字绑定注释关系,后期取出来的时候用固定语法取出注释,如:1表示男,我们取出来的时候取出男并不是取出数字1
1.绑定关系choices=((1,'男'),(2,'女'),(3,'其他'))
gender = models.IntegerField(choices=choices)
2.取choice里面罗列的数字与中文对应关系:
固定语法:
get_字段名_display()
如:print(user_obj.get_gender_display())
3. 取没有罗列出来的数字
不会报错,会展示数字,数字是多少就展示多少
二、数据库优化查询
1.update()与save()的区别
两者都是对数据的修改保存操作,但是save()函数是将数据列的全部数据项全部重新写一遍,效率极低,比如book_obj.save()会将对象所有属性重新保存一次
而update()则是针对修改的项进行针对的更新效率高耗时少,比如,update(price),指哪打哪只会保存价格这一个属性
所以以后对数据的修改保存用update()
2.惰性查询
查询集
是惰性执行的 —— 创建查询集
不会带来任何数据库的访问。你可以将过滤器保持一整天,直到查询集
需要求值时,Django 才会真正运行这个查询。
queryResult=models.Article.objects.all() # 只写这一句不会请求数据库
print(queryResult) # 直到你需要结果,此时才会查询数据库
for article in queryResult:
print(article.title) # 这样也会查询
orm内所有的语句操作 都是惰性查询:只会在你真正需要数据的时候才会走数据库,如果你单单只写orm语句时不会走数据库的
这样设计的好处 在于 减轻数据库的压力
3.only和defer 两对头
#only only会将括号内的所有的字段信息 全部查询出来封装对象中
res = models.Book.objects.only('title')
for r in res:
# print(r.title) # 只走一次数据库查询,将查询到的所有信息封装成一个对象,随后查询这些信息不需要再请求数据库,直接可以用点方法从对象中取出
print(r.price)
# 当你点击一个不是only括号内指定的字段的时候 不会报错 而是会帮你去数据库查询,循环几次查几次,频繁的走数据库查询,当你有成千上万条信息时对数据库造成一万点伤害
#defer defer会将不是括号内的所有的字段信息 全部查询出来封装对象中
res1 = models.Book.objects.defer('title') # defer与only是相反的
for r in res1:
# print(r.title)# 查询括号内的字段,会频繁的走数据库查询
print(r.price)#查询括号内没有的,只走一次
4. select_related 与 prefetch_related 两兄弟
res = models.Book.objects.all()
for r in res:
print(r.publish.name) #查询N次,这样是跨表查询,循环一次访问一次数据库,有一千万个书籍就查询一千万次#常规的all方法,查询自己表里没有的属性,就需要跨表查询,虽然可以获取,但是你去查询一次就会访问一次数据库,查询其他表就不推荐这个了#查询自己表里面有的属性时可以使用
#select_related 主动关联表
1. 主要针一对一和多对一关系进行优化。
2. 使用SQL的JOIN语句进行优化,通过减少SQL查询的次数来进行优化、提高性能
原文地址:https://www.cnblogs.com/luodaoqi/p/11750561.html