Django学习手册 - ORM 数据创建/表操作 汇总

 ORM 查询的数据类型:

  QuerySet与惰性机制(可以看作是一个列表)

  所谓惰性机制:表名.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它并不会马上执行sql,而是当调用QuerySet的时候才执行

  

QuerySet特点:

       <1>  可迭代的 

       <2>  可切片

       <3>  惰性计算和缓存机制

  例:

info=models.table_name.objects.all()[0:5]  #切片
info= models.table_name.objects.all()[3]    #索引

info= models.table_name.objects.all()        #可迭代
print(info.title)
for obj in info:                     print(obj.title)

 

 类对象

  <class 'models.表名'>类对象
  获取字段数值为  类.字段名 

 

 

创建 models 数据库

  一对一表创建

class A1(models.Model):id = models.IntegerField(primary_key=True)A11 = models.CharField(max_length=20)A12 = models.CharField(max_length=20)A13 = models.CharField(max_length=20)class E1(models.Model):id = models.IntegerField(primary_key=True)E11 = models.OneToOneField('A1',to_field='id',on_delete=models.CASCADE)E12 = models.CharField(max_length=20)# 定义 一对一关联:
# 格式:
# 字段 = models.OneToOneFied('关联表',to_field='关联表字段',on_delete=models.CASCADE)# 可添加参数:# related_name=名字  #外键反向查找别名(方便反向查找)# 使用方式; obj.名字.all()#在写ForeignKey字段的时候,如果想要在反向查找时不使用默认的 小写的表名_set,就在定义这个字段的时间加related参数!# related_query_name 字段=别名# 使用方式; obj.别名.all()# 一张表内两个外键 需要添加 related_query_name= 名字 从而识别是哪个外键值
# 示例:
# B11 = models.ForeignKey('A1',to_field='id',on_delete=models.CASCADE)

 

  外键(一对多创建)

# B1表跟A1表形成外键关系
class A1(models.Model):id = models.IntegerField(primary_key=True)A11 = models.CharField(max_length=20)A12 = models.CharField(max_length=20)A13 = models.CharField(max_length=20)class B1(models.Model):id = models.IntegerField(primary_key=True)B11 = models.ForeignKey('A1',to_field='id',on_delete=models.CASCADE)B12 = models.CharField(max_length=20)B13 = models.CharField(max_length=20)# 定义 外键:
# 格式:
# 字段 = models.ForeignKey('关联表',to_field='关联表字段',on_delete=models.CASCADE)# 可添加参数:# related_name=名字  #外键反向查找别名(方便反向查找)# 使用方式; obj.名字.all()#在写ForeignKey字段的时候,如果想要在反向查找时不使用默认的 小写的表名_set,就在定义这个字段的时间加related参数!# related_query_name 字段=别名# 使用方式; obj.别名.all()# 一张表内两个外键 需要添加 related_query_name= 名字 从而识别是哪个外键值
# 示例:
# B11 = models.ForeignKey('A1',to_field='id',on_delete=models.CASCADE)

 

  多对多表创建

# C1表跟D1表形成多对多的关系
class C1 (models.Model):id = models.IntegerField(primary_key=True)m = models.ManyToManyField('D1')C12 = models.CharField(max_length=20)C13 = models.CharField(max_length=20)class D1 (models.Model):id = models.IntegerField(primary_key=True)D12 = models.CharField(max_length=20)D13 = models.CharField(max_length=20)# 定义 多对多:
# 格式:
# 字段 = models.ForeignKey('关联表',to_field='关联表字段',on_delete=models.CASCADE)# 可添加参数:# through='UserFans'指定第3张关系表的表名# through_fields    指定第3张关系表的字段
# 示例:
# m = models.ManyToManyField('D1')

 

 多对多自关联创建

# userinfo 形成多对多的自关联
class Userinfo(models.Model):nikename=models.CharField(max_length=32)username=models.CharField(max_length=32)password=models.CharField(max_length=64)sex=((1,''),(2,''))gender=models.IntegerField(choices=sex)m=models.ManyToManyField('Userinfo')

 

ORM 操作

  单表操作/追加参数

# # 单表添加数据
# 单表操作# 格式:# 表名.objects.create()  # 导入的是表# module.表名.objects.create()  # 导入的是module模块#
    # 添加方式一:# models.表名.objects.create(字段1='参数1', 字段2='参数2')#
    # 添加方式二:# obj = models.表名(字段1 = '参数1', 字段2 = '参数2')# obj.save()# 示例:# # 方式一# models.A1.objects.create(A11='A1',A12='1',A13='1')#
    # # 方式二# data = {'A11': 'A2', 'A12': '2', 'A13': '2'}# models.A1.objects.create(**data)#
    # # 方式三# data2 = {'A11': 'A3', 'A12': '3', 'A13': '3'}# obj = models.A1(**data2)# obj.save()# QuerySet 数据类型:可以看作是一个列表
#   QuerySet 对象,可切片,索引,迭代# <class 'models.A1'>类对象: 就是一个类
#   相当于一个类,获取字段数值为 类.字段名# 单表查询数据# 查询所有数据# 格式:#     info=models.表名.objects.all()# 返回值:# query_set对象集合 [对象1、对象2、.... ]# obj = models.A1.objects.all()# print(obj) # QuerySet 对象# 查询单条数据#方式一 filter# 格式一:# info = models.表名.objects.filter(字段=参数)# 返回值:# 取值可以为  info[0]# query_set对象集合 [对象1]# obj2 = models.A1.objects.filter(id=1)  #查询不到数据为 空 QuerySet对象# print(obj2) # QuerySet 对象# # filter 可追加参数# obj21 = models.A1.objects.filter(id=1).first()  #第一条# obj22 = models.A1.objects.filter(id=1).last()   #最后一条# obj23 = models.A1.objects.filter(id=1).values_list()   #元组类型输出# obj24 = models.A1.objects.filter(id=1).values()        #字典类型输出# # print(type(obj21/22/23/24))  #<class 'models.A1'>类对象# .oder_by(-id):按照某列排序# .exclude(字段):字段获取数据时排除#方式二 get# info = models.表名.objects.get(字段=参数)# 返回值:# 单个对象,没有找到会报错# obj3 = models.A1.objects.get(id=1)  #查询不到数据报错!!!!# print(obj3)# print(type(obj3))  #<class 'models.A1'>类对象# 单表删除数据# 方式一:# models.A1.objects.filter(id=1).delete()# 方式二:# ob1 = models.A1.objects.get(id=1)# ob1.delete()# ob1.save()# 单表修改数据#修改方式1 update()# 格式:# models.表名.objects.filter(字段=参数).update(字段=参数)# models.A1.objects.filter(id=3).update(A11='A33',A12='A33',A13='A33')# data_updata = {'A11':'A33','A12':'A33','A13':'A33'}# models.A1.objects.filter(id=4).update(**data_updata)#修改方式2 obj.save()# obj = models.表名.objects.filter(字段=参数).get(字段=参数)# obj.字段 = 参数# obj.save()# ob1 = models.A1.objects.get(id=3)# ob1.A11 = 'A44'# ob1.A12 = 'A44'# ob1.A13 = 'A44'# ob1.save()# 更新数据操作:# 示例:# 格式:#  models.表名.objects.update_or_create(条件1=参数1, defaults={字段:属性})# 示例:#  tk = username#    models.Token.objects.update_or_create(user=user, defaults={'token': tk})# 找到更新 如果没有找到创建defaults={} 中的数据

 

  一对一表查询

# 一对一表操作# 添加删除修改(略)# # 查询# 正向查询(根据ontoon字段直接查询)# info1 = models.E1.objects.filter(id=1).values('id','E12','E11__A12','E11__A13')# info2 = models.E1.objects.filter(id=1).first().E11# print(info1)  # QuerySet# print(info2)  # A1 object (3)# #反向查询(反向查询跟foreignkey不同时的不需要 表名_set 这里只需要对表表名即可)# info1 = models.A1.objects.filter(id=3).values('id','A12','e1__id','e1__E12')# info2 = models.A1.objects.filter(id=3).first().e1# print(info1)    # QuerySet# print(info2)    # E1 object (1)

 

  一对多表操作

# 一对多表操作(外键)# # 一对多表操作:# 添加方式一:# models.表名.objects.create(字段1='参数1',字段2='参数2',外键ID='参数')#
    # 添加方式二:# obj=models.表名(字段1='参数1',字段2='参数2',外键=参数)# obj.save()# 一对多添加数据#方式一# data = {'B12':'B66','B13':'B66','B11_id':3}# models.B1.objects.create(**data)#方式二# data = {'B12':'B55','B13':'B55','B11_id':4}# obj = models.B1(**data)# obj.save()# 一对多表删除数据(跟单表操作一样)# 方式一:# models.B1.objects.filter(id=6).delete()# 方式二:# models.B1.objects.get(B12='B66').delete()# 一对多表修改数据(跟单表操作一样)# models.B1.objects.filter(id=3).update(B11_id=4)#一对多表查询数据(跨表查询)# 一对多表 跨表查询(正向查找 B表-外键字段-A表字段,下面两句等效)# info = models.B1.objects.filter(id=3).first().B11# info2 = models.B1.objects.get(id=3).B11# print(info)     # A1 object (4)# print(info2)    # A1 object (4)# # 一对多表 跨表查询(反向查找)(下面两条结果一致)# #方式一(根据 类的方式查找 ) (info.小写表名_set)# info = models.A1.objects.filter(id=4)# info1 = info.first().b1_set.values()# print(info1)    #values --- QuerySet类型# #方式二(根据values方式查找)(在values中  '小写表名__字段名' )# info2 = models.A1.objects.values('b1__B11','b1__B12','b1__B13').filter(id=4)# print(info2)    #values --- QuerySet类型

 

  多对多表操作

    #多对多表操作#多对多表添加操作# 如果两表之间存在双向1对N关系,就无法使用外键来描述其关系了;# 只能使用多对多的方式,新增第三张表关系描述表;# add()   添加# clear() 清空# remove() 删除某个对象# 正向添加 通过 多对多字段m.add增加#C1表id =1 字段 关联 D1表的 id = 1,2,3# obj = models.C1.objects.filter(id=1).first()# obj.m.add(1,2,3)# 反向添加 通过 小写表名_set.add增加# D1表id =1 字段 关联 C1表的 id = 1,2,3# obj2 = models.D1.objects.filter(id=1).first()# obj2.c1_set.add(1,2,3)#C1 id=3 关联 D1表id>3的数据# obj1 = models.C1.objects.filter(id=3).first()# obj2 = models.D1.objects.filter(id__gt=3)# obj1.m.add(*obj2)#多对多表删除操作# 正向删除# obj1 = models.C1.objects.filter(id=1).first()# obj1.m.remove(1,2,3)# 逆向删除# obj2 = models.D1.objects.filter(id=1).first()# obj2.c1_set.remove(2,3)# 清除数据# obj3 = models.C1.objects.filter(id=3).first()# obj3.m.clear()#多对多修改# ManyToManyField()字段 自动创建第3张关系表,可以使用字段跨表查询,但无法直接操作第3张表,# obj.m.all() 只有查询和清空 方法#多对多查询# 正向查询(通过多对多字段 直接查询)# obj = models.C1.objects.get(id=3).m.values()# print(obj)# 反向查询(通过.表名_set 查询)# obj = models.D1.objects.get(id=1).c1_set.values_list()# print(obj)

  

  多对多自关联操作

# 多对多自关联(由原来的3张表,变成只有2张表)
# 把两张表通过 choices字段合并为一张表
# ‘第三张关系表’ 使用models.ManyToManyField('Userinfo')生成# 同表正反向查询# 多对多 自关联 通过男士查询女生# boy_obj = models.Userinfo.objects.filter(id=2).first()# res = boy_obj.m.all()# for row in res:#     print(row.nikename)# # 多对多自关联 之通过女士查询男生# girl_obj = models.Userinfo.objects.filter(id=4).first()# res = girl_obj.userinfo_set.all()# for obj in res:#     print(obj.nikename)

 

  查询性能探究

    # 查询性能 :# 1、select_related:结果为对象  注意query_set类型的对象 都有该方法# 原理: 查询时主动完成连表形成一张大表,for循环时不用额外发请求;# 试用场景: 节省硬盘空间,数据量少时候适用相当于做了一次数据库查询;# info = models.B1.objects.filter(B11=4).all().select_related()# for i in info:#     print(i)# 2、prefetch_related:结果都对象是# 原理:虽好,但是做连表操作依然会影响查询性能,所以出现prefetch_related# prefetch_related:不做连表,多次单表查询外键表 去重之后显示, 2次单表查询(有几个外键做几次1+N次单表查询,# 适用场景:效率高,数据量大的时候试用# info = models.B1.objects.filter(B11=4).all().prefetch_related()# for i in info:#     print(i)

 

  F查询与Q查询

# F查询与Q查询#F 可以获取对象中的字段的属性(列),并对其进行操作;# from django.db.models import F,Q# models.表名.objects.all().update(price=F('price')+1)   #所在的列进行操作# Q多条件组合查询# Q()可以使orm的fifter()方法支持, 多个查询条件,使用逻辑关系(&、|、~)包含、组合到一起进行多条件查询;# 语法:# fifter(Q(查询条件1)| Q(查询条件2))# fifter(Q(查询条件2)& Q(查询条件3))# fifter(Q(查询条件4)& ~Q(查询条件5))# fifter(Q(查询条件6)| Q(Q(查询条件4)& ~ Q(Q(查询条件5)& Q(查询条件3)))包含# from django.db.models import F,Q#     1、F 可以获取对象中的字段的属性(列),并且对其进行操作;#     # models.Book.objects.all().update(price=F('price')+1)#     2、Q多条件组合查询#     #如果 多个查询条件 涉及到逻辑使用 fifter(,隔开)可以表示与,但没法表示或非得关系#     #查询 书名包含作者名的书#     book=models.Book.objects.filter(title__icontains='伟',author__name__contains='伟').values('title')#     #如何让orm 中得 fifter 支持逻辑判断+多条件查询? Q()登场#     book=models.Book.objects.filter(Q(title__icontains='伟') & Q(author__name__contains='伟')).values('title')#     book=models.Book.objects.filter(Q(author__name__contains='伟') & ~Q(title__icontains='伟')).values('title')#
        #    #多条件包含组合查询#    #查询作者姓名中包含 方/少/伟/书名包含伟3字 并且出版社地址以山西开头的书#     book=models.Book.objects.filter(#                                     Q(#                                     Q(author__name__contains='方') |#                                     Q(author__name__contains='少') |#                                     Q(title__icontains='伟')|#                                     Q(author__name__contains='伟')#                                     )#                                     &#                                     Q(publish__addr__contains='山西')#                                     ).values('title')#     print(book)# 注意:Q查询条件和非Q查询条件混合使用注意,不包Q()的查询条件一点要放在Q(查询条件)后面

 

部分资料查询于
https://www.cnblogs.com/sss4/p/7070942.html

 

转载于:https://www.cnblogs.com/Anec/p/9981899.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

applet实现大文件ftp上传(三)

下一步呢&#xff0c;当然就是对这个jar文件进行数字证书包装。流程如下&#xff1a; <1>、生成密匙证书(key certificate)&#xff0c;该证书将存储在你的.keystore文件中。Validity指的是密匙的有效期&#xff0c;默认是180&#xff0c;但是这里我们需要一年的时间&am…

网站301重定向 解决方法

网站301重定向&#xff0c;一般都是将不带www的域名转向带有www的&#xff0c;有几个小朋友问过几次需要在哪改&#xff0c;写出来不会的参考下。 1、新建一个“.htaccess”文件 2、复制以下代码&#xff1a;&#xff08;a你的域名&#xff09; Options FollowSymLinks rewrite…

Vue 从入门到进阶之路(十四)

之前的文章我们对 vue 的基础用法已经有了很直观的认识&#xff0c;本章我们来看一下 vue 中的生命周期函数。 上图为 Vue官方为我们提供的完整的生命周期函数的流程图&#xff0c;下面的案例我们只是走了部分情况流程&#xff0c;但所有的生命周期函数都涉及到了。 1 <!DOC…

css 清除浮动float 嗒嘀嗒滴 ----20181120

手动给父元素添加高度通过clear清除内部和外部浮动给父元素添加overfloat属性并结合zoom:1使用给父元素添加浮动        常用方法&#xff1a; ①给兄弟元素添加clear属性&#xff1a;添加一个class为clear&#xff1a;both&#xff0c; ②添加伪类&#xff1a;.clearf…

applet实现大文件ftp上传(一)

由于要用APPLET实现大文件FTP上传下载&#xff0c;从网上搜索了几下&#xff0c;找到很多资料&#xff0c;最后决定采用基于 org.apache.commons.net.ftp包实现FTP上传下载&#xff0c;Net包中的类既提供对协议的底层访问也有高层的抽象。在大多数情况下&#xff0c;抽 象是足够…

微软最爽命令行工具发布!

最近微软发布了命令行工具Windows Terminal&#xff0c;简直要让我们爽翻天 长期以来&#xff0c;Linux和Mac下的命令行工具自成一派&#xff0c;Windows却是另一套命令系统。这就比较恶心了&#xff0c;这也是很多开发者不选择Windows系统的原因。 但是现在完全不一样了&#…

定时任务 Cron表达式

Cron表达式由6~7项组成&#xff0c;中间用空格分开。从左到右依次是&#xff1a; 秒、分、时、日、月、周几、年&#xff08;可省略&#xff09; Cron表达式的值可以是数字&#xff0c;也可以是以下符号&#xff1a; "*"&#xff1a;所有值都匹配 "?"&…

vue项目中 axios请求拦截器与取消pending请求功能 - 年少、 - 博客园

在开发vue项目中&#xff0c;请求是不可缺少的&#xff0c;在发送请求时常常需要统一处理一些请求头参数等设置与响应事件&#xff0c;这时利用请求拦截器再好不过。 这里以axios请求为例 实现了设置统一请求头添加token, 其中token在登录时被存入了localStorage中。 同时拦…

gitbook 入门教程之解决windows热加载失败问题

破镜如何贴花黄 gitbook 在 Windows 系统无法热加载,总是报错! gitbook 是一款文档编写利器,可以方便地 markdown 输出成美观优雅的 html ,gitbook serve 启动服务器后,原来相貌平平的 markdown 丑小鸭摇身一变就成了倾国倾城的 html 绝色佳人. 如果源文件发生更改,Windows 却无…

理解DOM事件流的三个阶段 - Lxxyx的开发笔记 - SegmentFault 思否

本文主要解决两个问题&#xff1a; 什么是事件流 DOM事件流的三个阶段 起因 在学习前端的大半年来&#xff0c;对DOM事件了解甚少。一般也只是用用onclick来绑定个点击事件。在寒假深入学习JavaScript时&#xff0c;愈发觉得自己对DOM事件了解不够&#xff0c;遂打开我的《J…

支付宝APP支付 统一下单 php服务端 tp5

/*支付宝第三方支付 * *生成APP支付订单信息 * param number  uid 用户id * param string   token 用户token * param number  oid 订单id * param string   title 标题 * param string    body …

python第十九天(random、json、pickle、hashlib、hmac、shutil、shevle模块)

今日内容&#xff1a; 1. random 模块 2. json模块 3. pickle 模块 4.hashlib 模块 5. hmac 模块 6. shutil 模块 7. shelve 模块 1. random 模块&#xff1a; random 模块 获取随机值import randomfor i in range(10): print(random.random()) # random.random() 随机获取…

NodeJS入门04-Express路由和中间件 - 小之 - 博客园

nodeJS入门04-Express路由和中间件 Express框架是后台的Node框架&#xff0c;在后台的受欢迎的程度&#xff0c;和jQuery一样&#xff0c;就是企业的事实上的标准。 路由 路由是指如何定义应用的端点&#xff08;URIs&#xff09;以及如何响应客户端的请求。 路由是由一个 …

jmeter(四十五)常用Beanshell脚本

整理了一批jmeter常用的beanshell脚本供大家参考&#xff01; 时间戳 import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; try{ Date date new Date(); //获取当前时间 SimpleDateFormat sf new SimpleDateFormat("yyyy-MM-dd HH:mm…

Critical error detected c0000374

我发现出现上述错误是 free 两次内存 float* ddnew float[2];delete[] dd;delete[] dd;转载于:https://www.cnblogs.com/hook-gou/p/9994662.html

nodejs开发 过程中express路由与中间件的理解 - pyj063 - 博客园

nodejs开发 过程中express路由与中间件的理解 nodejs开发 express路由与中间件 路由 通常HTTP URL的格式是这样的&#xff1a; http://host[:port][path] http表示协议。 host表示主机。 port为端口&#xff0c;可选字段&#xff0c;不提供时默认为80。 path指定请求资源的…

错误MSB4018 “ResolvePackageAssets”任务意外失败的解决方法

昨天系统奔溃了&#xff0c;重装系统后发现&#xff0c;之前写的.netcore项目打开后重新生成报错&#xff0c;错误如下严重性 代码 说明 项目 文件 行 禁止显示状态 错误 MSB4018 “ResolvePackageAssets”任务意外失败。 NuGet.Packaging.Core.Packag…

(五)Unity插件生成

1&#xff09;新建空的AndroidStudio工程&#xff0c;但是新建过程时最小SDK版本要与unity一致&#xff0c;如下图所示&#xff0c;本次操作均为api16 2&#xff09;创建Library&#xff0c;如下图所示&#xff0c;新建module&#xff0c;然后选择Android Library。 新建模块为…

centeros7安装mysql - 风中追风_lonely - 博客园

转载自&#xff1a;https://www.linuxidc.com/Linux/2016-09/135288.htm 安装之前先安装基本环境&#xff1a;yum install -y perl perl-Module-Build net-tools autoconf libaio numactl-libs 1、配置YUM源 在MySQL官网中下载YUM源rpm安装包&#xff1a;http://dev.mysql.c…

失物招领平台6

昨天做了什么&#xff1a;学习了复选框、列表视图、网络视图&#xff0c;集体讨论了登录页面的构思 今天准备做什么&#xff1a;继续学习Android stdio&#xff0c;改善登录页面 遇到的问题&#xff1a;时间远远不够。转载于:https://www.cnblogs.com/sljslj/p/11056074.html