day07 ORM中常用字段和参数
day07 ORM中常用字段和参数
今日内容
- 常用字段
- 关联字段
- 测试环境准备
- 查询关键字
- 查看ORM内部SQL语句
- 神奇的双下划线查询
- 多表查询前提准备
常用字段
字段类型
AutoField
int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。
IntegerField
一个整数类型,范围在 -2147483648 to 2147483647。(一般不用它来存手机号(位数也不够),直接用字符串存,)
CharField
字符类型,必须提供max_length参数, max_length表示字符长度。
DateField
日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例。
DateTimeField
日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例
#应用上面自定义的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)
publish_time = models.DateField(auto_now=True,auto_now_add=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:外键字段
# 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
当删除关联表中的数据时,当前表与其关联的行的行为。(参考上面的例子)
ORM必知必会13条
创建表
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8,decimal_places=2) # 浮点型
publish_time = models.DateField(auto_now=True,auto_now_add=True) # 年月日
# auto_now :每次修改数据会自动更新当前时间
# auto_now_add :仅在创建时自动更新时间,之后不是人为的修改,则时间一直不变
'''django自带的sqlite数据库功能非常的少 并且对日期格式不兼容'''
1.MySQL配置
2.数据库迁移命令
3.ORM查询关键字
测试环境准备
# 测试环境有两种
1.python console(pycharm下方自带)
2.py文件形式(参考manage.py前四行) # 随便创建一个py文件,添加一下几行代码
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "py_dj7.settings")
import django
django.setup()
# 在该代码的下方才可以正常测试django文件
常用字段
# 只要是QuerySet对象,就可以无限制的调用QuerySet对象方法
1、all():查询所有结果
print(models.Book.objects.all())
'''QuerySet支持正数索引,不支持负数索引'''
2、filter(): 它包含了与所给筛选条件相匹配的对象 # 支持索引取值
print(models.Book.objects.filter(pk=1)) # fiter不加条件,也是查找所有
print(models.Book.objects.filter(pk=1).first()) # 拿去第一个数值
<QuerySet [<Book: 圣王>]> # QuerySet 列表套数据对象
'''
ilter可以写多个条件,并且中间用逗号当成and关系
pk相当于主键id,不在乎是id、uid等不同名称
可以根据索引取值,推荐使用first()
'''
3、first():返回第一个数据
print(models.Book.objects.filter(pk=1).first()) # 圣王
4、last():返回最后一个数据
print(models.Book.objects.all().last()) # 永生
4、 values(): values可以指定查询的字段,结果QuerySet 列表套字段,是一个可迭代的字典序列
print(models.Book.objects.values('title'))
<QuerySet [{'title': '圣王'}, {'title': '阳神'}, {'title': '遮天'}, {'title': '永生'}]>
'''
支持索引取值first()和last()、[0],但是不支持负数索引
'''
5、values_list():它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
print(models.Book.objects.values_list('title','price').first())
('圣王', Decimal('111.11'))
6、get():返回给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象不存在会抛出错误。
res = models.Book.objects.get(pk=1)
print(res,res.publish_time,res.price) # 圣王 2021-11-01 111.11
7、exclude(): 取反
print(models.Book.objects.exclude(pk=1))
8、order_by():排序(从小到大)
print(models.Book.objects.order_by('price'))
9、reverse():反转,配合order_by
print(models.Book.objects.order_by('price').reverse())
10、distinct():去重
res = models.Book.objects.all().values('title','price')
print(res.distinct())
<QuerySet [<Book: 圣王>, <Book: 阳神>, <Book: 遮天>, <Book: 永生>, <Book: 圣王>]>
'''注意:不加values会有id条件不同,索取去重的前提是把id过滤掉'''
11、count():计数
print(models.Book.objects.count()) # 4个
12、exisit():如果QuerySet包含数据,就返回True,否则返回False
print(models.Book.objects.filter(pk=10).exists()) # False
13、create():创建
14、update():修改
15、delete():删除
16、obj.save():保存
如何查看SQL语句
1、如果当前对象是queryset那么可以直接点query查找该对象内部SQL语句
res = models.Book.objects.all()
print(res.query)
2、settings.py配置文件(只要执行orm语句都会自动打印SQL语句)
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
神奇的双下划线查询
# 双下划线查询:
__gt:大于
__lt:小于
__gte:大于等于
__lte:小于等于
__in:在
__range:范围
__contains:包含
__startswith:以什么开头
__endswith:以什么结尾
_time__year:年
_time__month:月
案例1:查询书籍价格大于100的书
print(models.Book.objects.filter(price__gt=100)) # __gt:大于
案例2:查询书籍价格小于100的书
print(models.Book.objects.filter(price__lt=100)) # __lt:小于
案例3:查询书籍价格大于等于100的书
print(models.Book.objects.filter(price__gte=100)) # __gte:大于等于
案例4:查询书籍价格小于等于800的书籍
print(models.Book.objects.filter(price__lte=100)) # __lte:小于等于
案例5:查询书籍价格是92.12 或者35.60 或者111.11
print(models.Book.objects.filter(price__in=["92.12","35.60","111.11"])) #__in:在
案例6:查询书籍价格在100到200之间的书籍
print(models.Book.objects.filter(price__range=(100,200))) # __range:范围
案例7:查询书籍名称中包含字母p的书(区分大小写)
print(models.Book.objects.filter(title__contains='p')) # __contains:包含
案例8:查询书籍是否以...开头 ...结尾
print(models.Book.objects.filter(title__startswith='a')) # __startswith:以什么开头
print(models.Book.objects.filter(title__endswith='a')) # __endswith:以什么结尾
案例9:查询出版日期是2021的书(常用)
print(models.Book.objects.filter(publish_time__year=2021)) # _time__year:年
print(models.Book.objects.filter(publish_time__month=11)) # _time__month:月
day07 ORM中常用字段和参数的更多相关文章
- ORM中聚合函数、分组查询、Django开启事务、ORM中常用字段及参数、数据库查询优化
聚合函数 名称 作用 Max() 最大值 Min() 最小值 Sum() 求和 Count() 计数 Avg() 平均值 关键字: aggregate 聚合查询通常都是配合分组一起使用的 关于数据库的 ...
- Django ORM中常用字段和参数
一些说明: 表myapp_person的名称是自动生成的,如果你要自定义表名,需要在model的Meta类中指定 db_table 参数,强烈建议使用小写表名,特别是使用MySQL作为后端数据库时. ...
- Django ORM 常用字段和参数
Django ORM 常用字段和参数 一:常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. I ...
- Django框架 之 ORM 常用字段和参数
Django框架 之 ORM 常用字段和参数 浏览目录 常用字段 字段合集 自定义字段 字段参数 DateField和DateTimeField 关系字段 ForeignKey OneToOneFie ...
- ORM常用字段和参数
目录: ORM常用字段和参数
- Django中常用字段
一.Django框架的常用字段 Django ORM 常用字段和参数 常用字段 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列 ...
- Django框架(十一)—— 常用字段、参数、元信息、多对多关联关系
目录 常用字段和参数 一.ORM字段 二.ORM参数 三.关系字段 1.ForeignKey 2.OneToOneFiled 3.ManyToManyField 四.元信息 五.多对多关联关系的三种方 ...
- django orm介绍以及字段和参数
Object Relational Mapping (ORM) orm介绍 orm概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数 ...
- Django创建数据库常用字段及参数
Django创建数据库常用字段及参数 常用字段 1.models.AutoField 自增列= int(11) 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列 ...
随机推荐
- uvm中类继承和phase
1,uvm中类继承关系如下所示 2,uvm中phase如下所示
- git安装心得
每天码代码打卡任务,老师需要我们提交链接,这就需要我们把自己打的代码文件上传到GitHub上来,以此获得链接. 自己是一个新人,安装git也是什么都不懂(跟着网上的教程也总是能出错) 安装正常操作:h ...
- sqlldr导入报错:field in data file exceeds maximum length
检查报错日志提示:field in data file exceeds maximum length REMARK字段设置:varchar2(2000),报错的内容也没有超1000个字符 表中定义的字 ...
- 负载均衡算法WRR介绍
一.负载均衡 负载均衡是一个很大的概念,既有从硬件层面来解决问题的,又有从软件层面解决的,有关负载均衡的介绍,推荐阅读: http://os.51cto.com/art/201108/285359.h ...
- 装了这几个IDEA插件,基本上一站式开发了!
前言 前几天有社区小伙伴私聊我,问我都用哪些IDEA插件,我的IDEA的主题看起来不错. 作为一个开源作者,每周要code大量的代码,提升日常工作效率是我一直追求的,在众多的IDEA插件中,我独钟爱这 ...
- IDEA中Update resources和Update classes and resources、Redeploy、Restart server的区别
选项 描述 update resources 所有更改的资源都会更新(HTML,JSP,JavaScript,CSS和图像文件) update classes and resources 更改的资源将 ...
- 通过大量实战案例分解Netty中是如何解决拆包黏包问题的?
TCP传输协议是基于数据流传输的,而基于流化的数据是没有界限的,当客户端向服务端发送数据时,可能会把一个完整的数据报文拆分成多个小报文进行发送,也可能将多个报文合并成一个大报文进行发送. 在这样的情况 ...
- 全球首发-基于.NET 6长线支持Zoomla!逐浪CMS v8.6.0正式发布
传送门: https://www.z01.com/down/3778.shtml 全新Zoomla!逐浪CMS v8.6.0 全于首个基于.net 6长线支持的CMS-Zoomla!逐浪CMS v8. ...
- Python基础(迭代)
# from collections import Iterable#collections模块的Iterable类型判断 # dict1 = {'a':111,'b':222,'c':333} # ...
- Unity——有限状态机FSM修改
FSM状态机改 一.前言 FSM状态机初版 之前写过一版有限状态机,后来发现很多问题: 前一个版本是记录了当前的状态,切换状态时,要等下一帧状态机Update的时候才会调动上个状态的退出,总会有一帧的 ...