码迷,mamicode.com
首页 > 其他好文 > 详细

ORM

时间:2019-03-10 20:41:23      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:last   查询   列表   关系   book   icon   reg   pytho   publish   

 

ORM是什么

  对象和关系型数据库的映射

为什么要用ORM

必会13条:

1. 返回对象列表的
all()   Book.objects.all()
filter()
exclude()
order_by()
reverse()
distinct()
values() {}
values_list() ()

2. 获取对象的
get()
first()
last()

3. 返回数字
count()

4. 返回布尔值
exists()

单表双下: 

id__gt
id__lt
id__lte
id__gte

id__in=[]
id__range=[1,4]

contains= ‘‘
icontains= ‘‘

startswith = ‘‘
istartswith = ‘‘
endswith = ‘‘
iendswith = ‘‘

isnull = True

__year

FK外键

m2m 多对多

author_obj.books --》管理对象
author_obj.books.add()
author_obj.books.remove()
author_obj.books.clear()
author_obj.books.set() []
author_obj.books.create()

book_obj.authors --》管理对象

跨表双下

正相查

反向查

聚合

  Book.objects.all().aggregate(AVG("price"))   #查书的平均价格
  Book.objects.aggregate(Avg(‘price‘), Max(‘price‘), Min(‘price‘))

分组 

Employee.objects.values("dep").annotate(avg=AVG("salary"))
筛选出部门 annoteta是按前面的内容分组

# 查询每一个作者的名字以及出版书籍的最高价格
Author.objects.annotate(max_price=Max("book__price")).values("name","max_price")

# 查询96年以后出生的每一个作者的名字以及出版书籍的最高价格
Author.objects.filter(birthday__year__gt=1996).annotate(max_price=Max("book__price")).values("name","max_price")

# 查询不止一个作者的书籍名称以及关联的作者个数
Book.objects.all().annotate(c=Count("authors")).filter(c__gt=1).values("title","c")

# 查询部门1的每一个销售的名字以及今天对应的成单量
Userinfo.objects.filter(depart_id=1).filter(customer__deal_date=now).annotate(c=Count("customers")).values("name","c")

统计每一本书的作者个数
ret=Book.objects.annotate(authorsNum=Count(‘authors__name‘))

F   

  Book.objects.filter(commnetNum__lt=F(‘keepNum‘))  #查评论数小于keepNum的
  Book.objects.all().update(price=F("price")+30)  #所有书的价格加30

Q: 查询条件or的关系

用|分割不同的Q查询条件,
查询作者名称是max或ding的书
bookList=Book.objects.filter(Q(authors__name="max")|Q(authors__name="ding"))


  Q 对象可以使用~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询
  bookList=Book.objects.filter(Q(authors__name="yuan") & ~Q(publishDate__year=2017)).values_list("title")


  Q 对象,它必须位于所有关键字参数的前面。
  Book.objects.filter(Q(publishDate__year=2016) | Q(publishDate__year=2017),title__icontains="python")

 

2种查询方式

  1. 基于对象查询  对应sql的子查询

    正向: book_obj.authors.all()

    反向:author_obj.book_set.all()

  2. 基于双下划线查询  对应sql的join连表查询

    正向: Book.objects.filter(title="python").values("publish__name")     #查python的出版社名称

    反向: Author.objects.filter(name__startswith="a").values("book__title")   #查姓名是a开头的作者有哪些书

ORM

标签:last   查询   列表   关系   book   icon   reg   pytho   publish   

原文地址:https://www.cnblogs.com/yunfengding/p/10506714.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!