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=1,id__lt=4)
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
# 多对多 1.create author_obj = models.Author.objects.first() print(author_obj.name) #查询小黑1 写过的书 ret =author_obj.books.all() print(ret) # 1. create # 通过作者创建一本书,会自动保存, # 做了两件事 #1 。在book表里创建一本新书,2.在作者和书的关系表里添加关联 author_obj.books.create(title ='金老板自传',publisher_id =2 )
结果会在book表和book author关系表里自动添加数据。
add
# 2.add book_boj =models.Book.objects.get(id =8) author_obj.books.add(book_boj ) # 添加多个 book_objs =models.Book.objects.filter(id__gt=5) author_obj.books.add(*book_objs) #要把列表打算再传进去. #直接添加id author_obj.books.add(9)
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)