Django之模型层
orm常用的字段
AutoField 这个字段是代表我键的这个字段是自增的,而且里面必须要填priamry_key=True这个参数CharField 这个就等于数据库里面的varchar()但它里面必须要填max_length这个参数来标识字符长度IntegerField 是一个整数类型,范围在2147483648 to 2147483647。(一般不用它来存手机号(位数也不够),直接用字符串存,)DateField日期字段,里面有可以放参数,其中auto_now代表的是只要操作数据,其时间也会跟着变,auto_now_add代表的是只有创建的时候,才会创建时间,后面怎么改记录,时间都不会变,一般都是auto_now_addDecimalField()可以控制小数的,max_digits表示总共几位,decimal_places=表示小数占几位
字段中的参数
null 表示这个字段可以为空 unique 如果设置为true就跟数据库中一样,表示唯一 db_index 为true表示为该字段设置索引 default 设置默认值DateField和DateTimeFieldauto_now 表示数据修改,我的时间也会跟着修改 auto_now_add 表示只有数据在创建的时候,我的时间也会跟着创建,但后面数据怎么修改,我都不会变关系字段ForeignKeyto 设置要关联的表 to_field 设置要建立的外键字段,不填,默认是和关联的表的主键建立外键字段on_delete 表示当删除表中的数据的时候,其和关联的表的行为on_constranit 是否在数据库中创建外键约束,默认是true
一对一
OnetoOneField
多对多
ManyToManyField
单表的增删改查
1.单表操作 create_time = models.DateField() 关键性的参数 1.auto_now:每次操作数据 都会自动刷新当前操作的时间 2.auto_now_add:在创建数据的时候 会自动将创建时间记录下来 后续的修改不会影响该字段
在django中我们可以自定义一个测试文件,在里面写测试脚本,不需要再视图操作模型表那么麻烦了
这样就可以直接运行你的test.py文件来运行测试
必知必会13条
all()查询出所有
filter(**kwargs):包含了所有与筛选条件匹配的对象,就是一个列表里面套对象,没有就是一个空
get是只获取一个也是对象本身,如果没有则会报错
exclude(**kwargs):取反,它包含了所有与筛选条件不匹配的内容
values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
order_by(*field): 对查询结果排序
reverse(): 对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)。
distinct(): 从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。)
first()表示返回匹配懂啊的第一个记录
last表示返回匹配到的最后一个记录
count(): 返回数据库中匹配查询(QuerySet)的对象数量。
exists(): 如果QuerySet包含数据,就返回True,否则返回False
总结:
返回queryset对象的有:
all()
filter()
exclude()
order_by()
reverse()
distinct()
特殊的queryset
value返回是一个字典序列
value_list返回是一个元祖序列
返回具体对象
get()
first()
last()
布尔值
exists()
返回数字的方法有
count()
Django打印sql语句有2种方式
一种是有约束的,就是queryset对象可以通过query这个方法查看相对应的sql语句
第二种是无限制的,只要你执行了表的语句,都会打印相应的sql语句,就是在settings中配置一下,具体如下:
LOGGING = {'version': 1,'disable_existing_loggers': False,'handlers': {'console':{'level':'DEBUG','class':'logging.StreamHandler',},},'loggers': {'django.db.backends': {'handlers': ['console'],'propagate': True,'level':'DEBUG',},} }
神奇的双下划线用法:
原本我们查找是这样的 models.User.objects.filer(age=10) 现在我要求大于20的怎么弄呢,不能>,当有这种特殊的需求的时候,就要用到双下划线了 __gt 大于 __lt 小于 __gte 大于等于 __lte 小于等于__in 代表在不在里面,一个集合__range 是什么到什么的关系,也就是一个闭区间模糊查询,也就是判断包含不包含 __contains 这个识别大写小写 __icontains 这个忽略大小写—startswith这个判断以什么开头__endswith 这个是以什么结尾__year 按年查询
多表查询
一对多字段的增删改查
增: publish_id传数字 models.Book.objects.create(title='三国演义',price=189.99,publish_id=1) publish直接传出版社对象 publish_obj = models.Publish.objects.filter(pk=2).first() models.Book.objects.create(title='红楼梦',price=999.99,publish=publish_obj)改传数字的models.Book.objects.filter(pk=1).update(publish_id=3) 传对象的 publish_obj = models.Publish.objects.filter(pk=2).first() models.Book.objects.filter(pk=1).update(publish=publish_obj)删除 models.Publish.objects.filter(pk=2).delete() # 默认都是级联更新 级联删除
多对多增删改查
前提都是将要给增删改查的对象先找出来,然后再对象点那个虚拟字段后面跟方法来完成增删改查。 增book_obj = models.Book.objects.filter(pk=1).first()print(book_obj.authors) # 对象点击多对多虚拟字段 会直接跨到多对多的第三张表 book_obj.authors.add(1) book_obj.authors.add(2,3) 支持多个传参 还支持弄对象 author_obj = models.Author.objects.filter(pk=1).first() author_obj1 = models.Author.objects.filter(pk=2).first() author_obj2 = models.Author.objects.filter(pk=3).first() book_obj.authors.add(author_obj) book_obj.authors.add(author_obj1,author_obj2) 小结: add()是给书籍添加作者 括号内既可以传数字也可以传对象 并且支持一次性传多个 逗号隔开即可 改book_obj = models.Book.objects.filter(pk=1).first() book_obj.authors.set([2,]) book_obj.authors.set([2,3])author_obj = models.Author.objects.filter(pk=1).first() author_obj1 = models.Author.objects.filter(pk=2).first() author_obj2 = models.Author.objects.filter(pk=3).first() book_obj.authors.set([author_obj,]) book_obj.authors.set([author_obj, author_obj1, author_obj2]) 小结: set() 括号内必须是一个可迭代对象,可迭代对象里面可以是数字,也可以是对象,但记着不要混合用删除book_obj = models.Book.objects.filter(pk=1).first() book_obj.authors.remove(3)book_obj.authors.remove(1,2)author_obj = models.Author.objects.filter(pk=1).first() author_obj1 = models.Author.objects.filter(pk=2).first() author_obj2 = models.Author.objects.filter(pk=3).first()book_obj.authors.remove(author_obj) book_obj.authors.remove(author_obj1,author_obj2) 小结: remove()即支持数字,也支持对象,也可以传多个 将关系全部清空用clear()即可 book_obj.authors.clear()不用传参
跨表查询(重点!!!)
正向查询和反向查询(重点!!!)
正向与方向的概念解释一对一 正向:author---关联字段在author表里--->authordetail 按字段 反向:authordetail---关联字段在author表里--->author 按表名小写查询jason作者的手机号 正向查询 查询地址是 :山东 的作者名字 反向查询一对多 正向:book---关联字段在book表里--->publish 按字段反向:publish---关联字段在book表里--->book 按表名小写_set.all() 因为一个出版社对应着多个图书多对多正向:book---关联字段在book表里--->author 按字段 反向:author---关联字段在book表里--->book 按表名小写_set.all() 因为一个作者对应着多个图书
基于双下划线的跨表查询(连表查询,就不再2行代码了,而是一行了)
# 一对一 -连表查询-一对一双下划线查询-正向:按字段,跨表可以在filter,也可以在values中-反向:按表名小写,跨表可以在filter,也可以在values中# 查询jason作者的手机号 正向查询 跨表的话,按字段# ret=Author.objects.filter(name='jason').values('authordetail__phone')# 以authordetail作为基表 反向查询,按表名小写 跨表的话,用表名小写# ret=AuthorDetail.objects.filter(author__name='jason').values('phone')# 查询jason这个作者的性别和手机号# 正向# ret=Author.objects.filter(name='jason').values('sex','authordetail__phone')# 查询手机号是13888888的作者性别# ret=Author.objects.filter(authordetail__phone='13888888').values('sex')# ret=AuthorDetail.objects.filter(phone='13888888').values('author__sex')""" 总结 其实你在查询的时候先把orm查询语句写出来,再看用到的条件是否在当前表内,在就直接获取,不在就按照正向按字段反向按表名来查即可 比如:1.查询出版社为北方出版社的所有图书的名字和价格res1 = Publish.objects.filter(name='').values('book__name','book__price')res2 = Book.objects.filter(publish__name='').values('name','price')2.查询北方出版社出版的价格大于19的书res1 = Publish.objects.filter(name='',book__price__gt=19).values('book__name','book__price) """
聚合查询
aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。 用到的内置函数: from django.db.models import Avg, Sum, Max, Min, Count 示例: >>> from django.db.models import Avg, Sum, Max, Min, Count >>> models.Book.objects.all().aggregate(Avg("price")) {'price__avg': 13.233333} 还可以为聚合函数指定一个名称 >>> models.Book.objects.aggregate(average_price=Avg('price')) {'average_price': 13.233333}
分组查询
from django.db.models import Avgres = models.Book.objects.annotate(别名=聚合函数).values(别名,其他内容) values是获取某个表中的某个字段
F与Q查询
F查询就是通过数据库获取某个字段对应的值
from django.db.models import F models.Book.objects.filter(priice=F(price)
Q查询就是修改查询的条件的。
from django.db.models import Q res = models.Book.objects.filter(title='三国演义',price=444.44) # filter只支持and关系 res1 = models.Book.objects.filter(Q(title='三国演义'),Q(price=444)) 如果用逗号 那么还是and关系 res2 = models.Book.objects.filter(Q(title='三国演义')|Q(price=444)) res3 = models.Book.objects.filter(~Q(title='三国演义')|Q(price=444))
高级Q用法
q = Q() q.connector = 'or' # 修改查询条件的关系 默认是and q.children.append(('title__contains','三国演义')) # 往列表中添加筛选条件 q.children.append(('price__gt',444)) # 往列表中添加筛选条件 res = models.Book.objects.filter(q) # filter支持你直接传q对象 但是默认还是and关系 print(res)
自定义Char字段
class MyChar(models.Field):def __init__(self,max_length,*args,**kwargs):self.max_length = max_lengthsuper().__init( max_length=max_length,*args,**kwargs )def db_type(self, connection):return 'char(%s)'%self.max_length
查询优化
only 和 defer这2个都是查出来是一个列表套对象,但不一样的是,only如果获取的是括号内指定的字段,会直接获取,如果获取的不是指定的字段,那么会频繁的访问数据库。而defer则正好相反,如果获取的是指定的字段,那么会频繁的访问数据库,如果不是指定的字段则是会直接获取。select_related 和 prefect_related都是做连表操作的。括号内都只能放外键字段,并且可以连续用__连外键字段,并且只支持一对多核一对一。 不同处:select_related这个是直接连表,而prefect_related则是现将这个外键字段对应的id值拿到,然后再用这个id值去另外关联的表中找到一一对应的值。
注意:orm中的语句操作,全部都是惰性查询,就是只有在真正需要这个数据的时候,才会去访问数据库,减少数据库的压力
事务
from django.db import transactionwith transaction.atomic():"""数据库操作在该代码块中书写的操作 同属于一个事务"""models.Book.objects.create()models.Publish.objects.create()# 添加书籍和出版社 就是同一个事务 要么一起成功要么一起失败print('出了 代码块 事务就结束')
转载于:https://www.cnblogs.com/xinfan1/p/11545501.html
Django之模型层相关推荐
- 【Django】模型层说明
[Django模型层] 之前大概介绍Django的文章居然写了两篇..这篇是重点关注了Django的模型层来进行学习. ■ 模型定义 众所周知,Django中的模型定义就是定义一个类,其基本结构是这样 ...
- Django模板自定义标签和过滤器,模板继承(extend),Django的模型层
上回精彩回顾 视图函数:request对象request.path 请求路径request.GET GET请求数据 QueryDict {}request.POST POST请求数据 QueryDic ...
- Django MTV - 模型层 - (专题)知识要点与实战案例
Django- 模型层(models)知识要点与实战案例 (专题概述及索引) 概述:本专题以讨论Django中模型层相关的基础知识,这些基础知识在我们的日常开发中有着相当重要的作用.模型(models ...
- Django之模型层和ORM
在之前的文章中已经介绍过数据库的操作使用,但是不够系统,今天就模型层和ORM做一个系统的介绍.所谓模型层就是主要负责和数据库之间进行数据交互的一个模块 Django连接mysql数据库,安装mysql ...
- django框架——模型层(下)
系列文章目录 第一章 django安装与介绍 第二章 django基础使用 第三章 路由层 第四章 虚拟环境.django版本区别.视图层 第五章 模板层 第六章 模型层(上) 第七章 模型层(下) ...
- django之七(模型层ORM相关)
ORM字段 常见字段 1.CharField(max_length,verbose_name=)) 2.AutoField(primary_key)BigAutoField(AutoField)- b ...
- Django 之 模型层
文章目录 模型层 单表查询 多表新增 多表修改 多表删除 绑定关系 多表查询 拓展:多对多表三种创建方式 F查询和Q查询 F查询 Q查询 事务 模型层 Django 模型是与数据库相关的,与数据库相关 ...
- Django框架——模型层单表操作、模型层多表操作、模型层常用和非常用字段和参数、模型层进阶
文章目录 1 模型层-单表操作 一 ORM简介 二 单表操作 2.1 创建表 1 创建模型 2 更多字段 3 更多参数 4 settings配置 5 增加,删除字段 2.2 添加表纪录 2.3 查询表 ...
- Django之路——6 Django的模型层(一)
ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的 ...
- Django 07模型层—单表操作(增删改查)
单表查询 一.数据库相关设置 ''' # Mysql连接配置 DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': ...
最新文章
- Linux中压缩、解压缩(tar/zip/bzip2/gz/gzip/zip)
- Linux命令行下登录ssl加密的ftp
- php laravel 默认cookie加密 读取怎么办_Laravel+Nginx轻松实现读写分离、负载均衡,网站并发能力提升N倍...
- X265源码解析1-Encode方法
- git使用—rebase还是merge
- 使用echarts(二)自定义图表折线图
- vscode与git分支_Visual Studio Code 使用Git进行版本控制
- 【语音识别】基于matlab矢量量化(VQ)说话人识别【含Matlab源码 575期】
- restlet和ajax,使用Web测试插件Restlet Client发送Get和Post请求的方法教程
- 算法常用术语中英对照
- 怎么修改打印机服务器权限,Win7如何设置网络打印机管理权限
- Matlab基于蚁群算法求解多旅行商MTSP问题
- 大数据平台自动化运维,数据中心运维平台
- Freemarker 简介 及手册
- android p正式版一加6,国内首家!一加氢OS Android P正式版更新
- Windows搭建cloudever对接OneDrive教程(新版)
- SSM+图书馆电子文件资源管理 毕业设计-附源码191614
- CCF 俄罗斯方块(满分代码 + 解题思路 + 技巧总结)201604 - 2
- 洗地机性价比高的是哪款?性价比高适合入手的洗地机介绍
- AD9361 介绍 (中)
热门文章
- java推送微信消息换行_5行代码实现微信小程序模版消息推送 (含推送后台和小程序源码)...
- java 服务端 处理跨域_javaweb服务端跨域支持
- 计算机编程关键字一,和计算机编程有关的101条伟大的名言
- jquery替换节点
- yolov3识别的类别_Gaussian YOLOv3:一个更强的YOLOv3,现已开源!
- Unity3D基础37:Input控制面板
- Unity3D基础19:Tag标签
- 安卓网络连接全解:包括网络连接状态的监听、网络数据使用状态的监听、获取当前网络连接情况、启动wifi、获取当前连接wifi的网络情况、扫描wifi热点
- js中函数的三种定义方式、函数声明、函数同名重复、函数删除、
- -----表达式-处理字符串表达式// A(A>0.5)