day 69 ORM 多表增删改查操作
http://www.cnblogs.com/liwenzhou/p/8660826.html
下面的代码是在 python console中配置的。 关闭pycharm会消失。
from app01 import models
models.Person.objects.all()
<QuerySet [<Person: 小黑>, <Person: 小黑2>, <Person: 小黑6>]>
在Python脚本中调用Django环境
import os if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")
import django
django.setup() from app01 import models books = models.Book.objects.all()
print(books)
1.查询所有人
ret = models.Person.objects.all()
print(ret)
结果:
<QuerySet [<Person: 小黑>, <Person: 小黑2>, <Person: 小黑6>]>
2.get的查询方法
ret = models.Person.objects.get(id =1) #id为 不存在的话会报错
print(ret)
结果:
小黑 3.filter查询
ret = models.Person.objects.filter(name ="小黑")
print(ret)
结果
<QuerySet [<Person: 小黑>]>
为什么会是这个结果因为:
class Queryset(list):
4. 查询id大于1的数据
ret =models.Person.objects.filter(id__gt=1) #如果id等于100 ,不会报错,会返回一个空的QuerySet对象。
print(ret)
结果:
<QuerySet [<Person: 小黑2>, <Person: 小黑6>]>
5.查询id等于1的数据,并取出里面的数据通过索引的方式取出来
ret =models.Person.objects.filter(id=1)[0]
print(ret)
结果:
小黑
6.exclude
print('exclude'.center(120,'*'))
ret =models.Person.objects.exclude(id=1)
print(ret)
结果
********************************************************exclude*********************************************************
<QuerySet [<Person: 小黑2>, <Person: 小黑6>]>
7.values(不写字段名,默认查询所有的字段)
ret = models.Person.objects.values('birthday')
print(ret)
结果
<QuerySet [{'birthday': datetime.date(2018, 5, 10)}, {'birthday': datetime.date(2018, 5, 25)}, {'birthday': datetime.date(2018, 5, 3)}]>
8.values_list, 返回一个QuerySet对象,里面都是元组,不写字段,会查询所有
ret = models.Person.objects.values_list('name','birthday')
print(ret)
结果 <QuerySet [('小黑', datetime.date(2018, 5, 10)), ('小黑2', datetime.date(2018, 5, 25)), ('小黑6', datetime.date(2018, 5, 3))]> 9 .order_by 对查询结果进行排序
ret = models.Person.objects.all().order_by('birthday')
print(ret)
相当于设置元类 在Person类的下面
class meta:
ordering =(‘birthday’) 结果
<QuerySet [<Person: 小黑6>, <Person: 小黑>, <Person: 小黑2>]>
10.reverse 将一个有序的QuerySet进行反转
ret =models.Person.objects.all().order_by('birthday').reverse()
print(ret)
结果:
<QuerySet [<Person: 小黑2>, <Person: 小黑>, <Person: 小黑6>]>
11. count 返回QuerySet中对象的个数
ret =models.Person.objects.all().count()
print(ret)
结果
3 12. first 返回QuerySet对象中第一个元素
ret =models.Person.objects.first()
print(ret)
结果:
小黑 13. last 返回QuerySet对象中最后一个元素
ret =models.Person.objects.last()
print(ret)
结果:
小黑6 14. exist 判断表里面有没有数据
ret =models.Person.objects.exists()#Person表中含有数据 返回True ,如果是空白则为False
print(ret)
结果:
True ,
二 、单表的双下划线查询
1. 查询id值大于1 小于4的结果.
ret = models.Person.objects.filter(id__gt=,id__lt=)
print(ret)
结果
<QuerySet [<Person: 小黑2>, <Person: 小黑6>]>
2. IN 操作查询id在【1,3,5,6】
ret = models.Person.objects.filter(id__in=[1,3,5,6])
print(ret)
结果:
<QuerySet [<Person: 小黑>, <Person: 小黑6>]>
3. exclude 排除在这些id的条目
ret = models.Person.objects.exclude(id__in=[1,3,5,6])
print(ret) 结果:
<QuerySet [<Person: 小黑2>]>
4. name_contains= (name__icontains 忽略大小写)
ret =models.Person.objects.filter(name__contains="6")
print(ret)
输出结果:
<QuerySet [<Person: 小黑6>]>
5. id_range =
ret =models.Person.objects.filter(id__range=[1,2]) #相当于sql语句的between 1 and 2
print(ret)
结果:
<QuerySet [<Person: 小黑>, <Person: 小黑2>]>
6. 日期和时间字段还可以有以下写法:
ret =models.Person.objects.filter(birthday__year=2018)
print(ret)
ret =models.Person.objects.filter(birthday__month=5)
print(ret) 结果:
<QuerySet [<Person: 小黑>, <Person: 小黑2>, <Person: 小黑6>]>
<QuerySet [<Person: 小黑>, <Person: 小黑2>, <Person: 小黑6>]>
三、正向查询
# 外键的查询操作
# 正向查询 方法一、
#基于对象 跨表查询
book_obj =models.Book.objects.all().first()
ret = book_obj.publisher #出版社对象
print(ret,type(ret))
ret=book_obj.publisher.name
print(ret,type(ret)) # 和我这本书关联的出版社对象. 结果:
这是沙河第一出版社对象 <class 'app01.models.Publisher'>
沙河第一出版社 <class 'str'>
正向查询方法二、
# 查询id是1的书的出版社的名称.
#双下划线就表示跨了一张表.
book_obj=models.Book.objects.filter(id=1).values('publisher__name')
print(ret)
结果:
沙河第一出版社
四、反向查询
# # 反向查询。用set关键字 (基于对象 查询)
publisher_obj =models.Publisher.objects.first()
# ret =publisher_obj.book_set.all()
# print(ret) # #另外一种写法 (基于双下滑线)
ret =publisher_obj.books.all() #books 为在Book类里设置的related_name 关键字的值
print(ret) 结果:
<QuerySet [<Book: 跟老男孩学linux>, <Book: java>]> related_name ='books' 反向查询是用来代替book_set的 根据双下划线 ret =modules.Publisher.objects.filter(id=1).value_list('ooxx__tile') #related_query_name ='ooxx'
五、多对多查询. ManytoManyField
# 多对多 .create
author_obj = models.Author.objects.first()
print(author_obj.name)
#查询小黑1 写过的书
ret =author_obj.books.all()
print(ret) # . create
# 通过作者创建一本书,会自动保存,
# 做了两件事
# 。在book表里创建一本新书,.在作者和书的关系表里添加关联
author_obj.books.create(title ='金老板自传',publisher_id = ) 结果会在book表和book author关系表里自动添加数据。
add
# .add
book_boj =models.Book.objects.get(id =)
author_obj.books.add(book_boj ) # 添加多个
book_objs =models.Book.objects.filter(id__gt=)
author_obj.books.add(*book_objs) #要把列表打算再传进去.
#直接添加id
author_obj.books.add()
remove
# remove 从金老板关联的书里吧开船删掉
# book_obj=models.Book.objects.get(title='gen金老板学开船')
# author_obj.books.remove(book_obj) book_obj =models.Book.objects.get(title="java")
print(book_obj)
author_obj.books.remove(book_obj)
day 69 ORM 多表增删改查操作的更多相关文章
- ORM多表增删改查
一 创建多表 在models.py里创建4张表:Author(作者).AuthorDetail(作者详细信息).Publish(出版社).Book(书) 四张表关系为: (1)首先创建一对一关系.On ...
- JAVA 操作远程mysql数据库实现单表增删改查操作
package MysqlTest; import java.sql.DriverManager; import java.sql.ResultSet; import com.mysql.jdbc.C ...
- Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查
一.Django项目的创建与介绍 ''' 安装Django #在cmd中输入pip3 #出现这个错误Fatal error in launcher: Unable to create process ...
- ORM之单表增删改查
ORM之单表增删改查 在函数前,先导入要操作的数据库表模块,model from model所在的路径文件夹 import model 在views文件中,加的路径: #就一个app01功能的文件 ...
- GZFramwork数据库层《三》普通主从表增删改查
运行结果: 使用代码生成器(GZCodeGenerate)生成tb_Cusomer和tb_CusomerDetail的Model 生成器源代码下载地址: https://github.com/Gars ...
- GZFramwork数据库层《一》普通表增删改查
运行结果: 使用代码生成器(GZCodeGenerate)生成tb_MyUser的Model 生成器源代码下载地址: https://github.com/GarsonZhang/GZCode ...
- Django框架(八)--单表增删改查,在Python脚本中调用Django环境
一.数据库连接配置 如果连接的是pycharm默认的Sqlite,不用改动,使用默认配置即可 如果连接mysql,需要在配置文件中的setting中进行配置: 将DATABASES={} 更新为 DA ...
- Django框架(九)—— 单表增删改查,在Python脚本中调用Django环境
目录 单表增删改查,在Python脚本中调用Django环境 一.数据库连接配置 二.orm创建表和字段 三.单表增删改查 1.增加数据 2.删除数据 3.修改数据 4.查询数据 四.在Python脚 ...
- 48.Python中ORM模型实现mysql数据库基本的增删改查操作
首先需要配置settings.py文件中的DATABASES与数据库的连接信息, DATABASES = { 'default': { 'ENGINE': 'django.db.backends.my ...
随机推荐
- [leetcode]228. Summary Ranges区间统计
Given a sorted integer array without duplicates, return the summary of its ranges. Example 1: Input: ...
- maven仓库的作用以及仓库的分类
maven的工作需要从仓库下载一些jar包,如下图所示,本地的项目A.项目B等都会通过maven软件从远程仓库(可以理解为互联网上的仓库)下载jar包并存在本地仓库,本地仓库 就是本地文件夹,当第二次 ...
- async与await
在方法上可以加 async,方法体内需要有 await,没有await的话,会出现warn警告.async单独出现是没有用的. await只能出现在Task前面.await Task的后面的代码会被封 ...
- PAT 1057 数零壹 (20)(代码+思路)
1057 数零壹(20 分) 给定一串长度不超过 105 的字符串,本题要求你将其中所有英文字母的序号(字母 a-z 对应序号 1-26,不分大小写)相加,得到整数 N,然后再分析一下 N 的二 ...
- script标签的type="test/html"时
们可以在<script>片断中定义一个被JS调用的代码,但代码又不在页面上显示,这时,我们可以使用下面的方法: 1 <script id="commentTemplate& ...
- 201621123008 《Java程序设计》第六周实验总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 2. 书面作业 1. clone方法 1.1 在 ...
- 怎样完整地离线更新并升级基于 Debian 的操作系统
不久之前我已经向你展示了如何在任意离线的 Ubuntu 和 Arch Linux 操作系统上安装软件. 今天,我们将会看看如何完整地离线更新并升级基于 Debian 的操作系统. 和之前所述方法的不同 ...
- 2018.10.13 bzo1934: [Shoi2007]Vote 善意的投票(最小割)
传送门 最小割定义题. 按照题意建边就行了. 考虑把冲突变成把aaa选入不与自己匹配的集合所需要付出的代价. 然后跑最小割就行了. 代码: #include<bits/stdc++.h> ...
- 2018.10.09 NOIP模拟 路途(递推+矩阵快速幂优化)
传送门 签到题.(考试的时候写挂爆0) 令AiA_iAi表示邻接矩阵的iii次幂. 于是就是求Al+Al+1+...+ArA_l+A_{l+1}+...+A_rAl+Al+1+...+Ar. ...
- 2018.07.03 BZOJ 1007: [HNOI2008]水平可见直线(简单计算几何)
1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MB Description 在xoy直角坐标平面上有n条直线L1,L2,-Ln, ...