django 数据库查询 ORM
Posted 睡觉的阿狸
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django 数据库查询 ORM相关的知识,希望对你有一定的参考价值。
单表操作:
添加记录:
# 方式1: #obj=Book.objects.create(title="python",publishDate="2012-12-12",price=100) 注意:Book.objects.create()的返回值是当前添加的记录对象这种方式不需要save() # 方式2: book_obj=Book(title="python2",publishDate="2012-12-12",price=100) book_obj.save()
查询记录:(数据类型:QuerySet) [...,...,]
<1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个, 如果符合筛选条件的对象超过一个或者没有都会抛出错误。 <5> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 <4> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列 <9> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 <6> order_by(*field): 对查询结果排序 <7> reverse(): 对查询结果反向排序 <8> distinct(): 从返回结果中剔除重复纪录 <10> count(): 返回数据库中匹配查询(QuerySet)的对象数量。 <11> first(): 返回第一条记录 <12> last(): 返回最后一条记录 <13> exists(): 如果QuerySet包含数据,就返回True,否则返回False 双下划线的查询: book_list=Book.objects.filter(price__gt=60) book_list=Book.objects.filter(price__lt=60) book_list=Book.objects.filter(title__contains="py") #这个用于查看是否包含某个数据。 book_list=Book.objects.filter(title__startswith="python") book_list=Book.objects.filter(price__in=[60,70,100]) book_list=Book.objects.filter(price__range=[50,99])
删除:
删除: Book.objects.filter().delete() # 默认级联删除
更新:
Book.objects.filter().update(price=50,.....)
一对多创建:
publish=models.ForeignKey(to="Publish",to_field="id")
多对多创建:
authors=models.ManyToManyField(to="Author") author=models.OneToOneField("Author")
一对一添加:
# 方式1: #Book.objects.create(title="python",publishDate="2012-12-12",price=100,publish_id=2) # 方式2: publish_obj=Publish.objects.filter(name="人民出版社")[0] Book.objects.create(title="python",publishDate="2012-12-12",price=100,publish=publish_obj)
多对多添加:
book_authors.objects.create(book_id=1,author_id=2) book_obj=Book.objects.create(title="python",publishDate="2012-12-12",price=100,publish_id=2) book_obj.authors.all() book_obj.authors.add(obj1,obj2....) book_obj.authors.add(*[]) # book_obj.authors.remove(obj1,obj2....) book_obj.authors.remove(*[]) book_obj.authors.clear() 批量添加: #在插入数据库记录的时候,需要将列表一条条插入数据库,容易造成性能浪费。插入一条记录生成一个sql语句。
#下方这个解决这个问题。 models.UserInfo.objects.bulk_create() #里面是一个列表,这样是生成一个sql语句,将里面的用户全部插入
基于对象的跨表操作(子查询):
正查询与反查询:
一对多: 正向查询,按字段:publish 反向查询,按表名小写_set 查询: 查询java这本书的出版社的邮箱 book_obj=Book.objects.filter(title="java").first() book_obj.publish.email
多对多: 正向查询,按字段:authors 反向查询,按表名小写_set 查询: book_obj.authors.all() # 与这本书籍关联的所有作者对象集合 author_obj.book_set.all()
一对一:
添加记录:参考一对多
查询记录:
正向查询,按字段:author
反向查询,按表名小写
基于QuerySet的跨表查询(join查询)
#一对多 publish:与当前书籍对象关联的的出版社对象 publish=models.ForeignKey(to="Publish",to_field="id") #多对多 authors authors=models.ManyToManyField(to="Author") author=models.OneToOneField("Author") 正向查询,按字段:publish 反向查询,按表名小写
一对多: 例1: 查询java这本书的出版社的邮箱(正向查询) ret=Book.objects.filter(nid__gt=6).values("publish__name") sql: SELECT "app01_publish"."name" FROM "app01_book" INNER JOIN "app01_publish" ON ("app01_book"."publish_id" = "app01_publish"."id") WHERE "app01_book"."nid" > 6 LIMIT 21; values实现机制: 对调用的QuerySet集合对象里面的每一个对象循环遍历,取出每一个对象的显示字段的值,组成新的字典,放在一个新的QuerySet中,返回 例2: # 查询人民出版社出版过的所有的书籍名称(反向查询) ret=Publish.objects.filter(name="人民出版社").values("book__title") print(ret) <QuerySet [{‘book__title‘: ‘golang‘}, {‘book__title‘: ‘linux2‘}, {‘book__title‘: ‘qq‘}, {‘book__title‘: ‘www‘}]>
多对多的查询 # 查询php这本书籍的所有作者的名字以及年龄 # ret=Book.objects.filter(title="php").values("authors__name","authors__age") # print(ret) # 查询alex出版社过的所有书籍的名称和价格 # ret=Author.objects.filter(name="alex").values("book__title","book__price") # print(ret)
一对一查询 # 查询tel=789的作者的名字 ret=AuthorDetail.objects.filter(tel="789").values("author__name") # 查询alex的手机号是多少 ret=Author.objects.filter(name="alex").values("authordetail__tel")
扩展: #查询人民出版社出版过的所有的书籍名称(两种查询思路,基表不同) ret=Publish.objects.filter(name="人民出版社").values("book__title") ret=Book.objects.filter(publish__name="人民出版社").values("title") # 手机号以151开头的作者出版过的所有书籍名称以及出版社名称 ret=Book.objects.filter(authors__authordetail__tel__startswith="7").values("title","publish__name") print(ret) SELECT "app01_book"."title", "app01_publish"."name" FROM "app01_book" INNER JOIN "app01_book_authors" ON ("app01_book"."nid" = "app01_book_authors"."book_id") INNER JOIN "app01_author" ON ("app01_book_authors"."author_id" = "app01_author"."id") INNER JOIN "app01_authordetail" ON ("app01_author"."id" = "app01_authordetail"."author_id") INNER JOIN "app01_publish" ON ("app01_book"."publish_id" = "app01_publish"."id") WHERE "app01_authordetail"."tel" LIKE ‘7%‘ ESCAPE ‘\‘ LIMIT 21; args=(‘7%‘,)
聚合查询与分组查询
ORM: # 聚合函数 aggregate from django.db.models import Sum,Count,Max,Min,Avg # ret=Book.objects.all().aggregate(Sum("price")) # print(ret) # 分组函数 annotate # 查询每一个出版社出版社出版的书籍个数 # ret=Publish.objects.all().annotate(c=Count("book__title")).values("name","c") # print(ret) # <QuerySet [<Publish: 人民出版社>, <Publish: 机械出版社>, <Publish: 北京出版社>]> # 查询每一本书的作者个数 #ret=Book.objects.all().annotate(author_num=Count("authors")).values("author_num","title") # ret=Book.objects.all().annotate(author_num=Count("authors")).filter(author_num__gt=0) # print(ret)
xxx
以上是关于django 数据库查询 ORM的主要内容,如果未能解决你的问题,请参考以下文章