三篇文章带你了解基础、进阶、高端篇Django ORM操作(高端)

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理

本文章来自腾讯云 作者:Python进阶者

查询
聚合操作
聚合操作,不要被名字吓到了,通常用在筛选完一些数据之后,求一下平均值了,什么的。

例如:求所有书的总价格和平均价格

原生sql

SELECT
    SUM(price) AS "所有书总价格",
    avg(price) AS "所有书平均价格"
FROM
web_book;

 

执行结果

ORM

price = models.Book.objects.all().aggregate(Sum("price"),Avg("price"), )
print(price)

 

执行结果

在这里插入图片描述
可以发现和上面是一样的,但是会发现列名是默认是字段__聚合函数名。

原生sql是可以指定显示的列名的,同样,ORM也可以。

代码

# 需要导入的包
    from django.db.models import Avg,Sum
    
    price = models.Book.objects.all().aggregate(所有书总价格=Sum("price"), 所有书平均价格=Avg("price"), )
    print(price)

 

执行结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果我们能对出版社id进行压缩,然后再求出压缩出版社id里面对应的数量。

啧啧,这不就出来了吗?

代码

from django.db.models import Count

ret = models.Book.objects.values("publish_id").annotate(publish_count=Count("publish_id"))
print(ret)

 

执行结果
在这里插入图片描述
原生sql

SELECT
    `web_book`.`publish_id`,
    COUNT(`web_book`.`publish_id`) AS `publish_count`
FROM
    `web_book`
GROUP BY
    `web_book`.`publish_id`;

 

ORM分组和原生SQL对应图

这一块,我记得当初我迷茫了一段时间,主要是不知道如何和原生SQL对应上,根据多次测试经验,对应图如下。

在这里插入图片描述
分组获取外键字段信息
上述确实可以通过分组实现了功能。

但是上述只能获取出版社id,并不能获取出版社名啥的,但是如何获取压缩外键字段详细信息呢?

代码

ret = models.Book.objects.values("publish_id").annotate(publish_count=Count("publish_id")).values("publish__title","publish__phone","publish_count")
print(ret)

 

执行结果

在这里插入图片描述
在这里插入图片描述
代码

ret = models.Book.objects.values("publish_id") \
    .annotate(publish_count=Count("publish_id")) \
    .filter(publish_count__gt=2)
print(ret)

 

执行结果
在这里插入图片描述
在这里插入图片描述
代码

from django.db.models import F

book = models.Book.objects.filter(comment_num__lt=F("collect_num"))
print(book)

 

实际结果
在这里插入图片描述
在这里插入图片描述

from django.db.models import F

book = models.Book.objects.filter(comment_num__lt=F("collect_num")*2)
print(book)

 

执行结果
在这里插入图片描述
在这里插入图片描述
代码

from django.db.models import Q

books = models.Book.objects.filter(Q(title="<<大明帝国>>") | Q(title="<<安史之乱>>"))
print(books)

 

执行结果

在这里插入图片描述
在这里插入图片描述
代码

from django.db.models import Q

books = models.Book.objects.filter(Q(title="<<大明帝国>>") | ~Q(title="<<安史之乱>>"))
print(books)

 

执行结果
在这里插入图片描述
在这里插入图片描述

from django.db.models import Q

books = models.Book.objects.filter(Q(title="<<大明帝国>>") | ~Q(title="<<安史之乱>>"),publish_id=1)
print(books)

 

在这里插入图片描述

q = Q()
# 查询方式,or还是and
q.connector = "or"  # or,and
# publish_id=1
q.children.append(("publish_id", "1"))
# title__contains="大明"
q.children.append(("title__contains", "大明"))

books = models.Book.objects.filter(q)
print(books)

 

执行结果
在这里插入图片描述

上面说了那么多,终于算是大概说完了,来简单看一下怎么添加一条数据吧。

示例:添加一本书

代码

方式一,通过objects.create。

models.Book.objects.create(
    title="<<人类简史2>>",
    price=66.66,
    PublishDate="2020-01-02",
    comment_num=23,
    collect_num=12,
    # 外键字段 django models对应的mysql 为 字段_id
    publish_id=1,
    # publish字段需要是一个 Publish 对象
    # publish=models.Publish.objects.filter(id=1)
)

 

方式二,通过model对象.save()。

book_obj = models.Book(
    title="<<人类简史2>>",
    price=66.66,
    PublishDate="2020-01-02",
    comment_num=23,
    collect_num=12,
    # 外键字段 django models对应的mysql 为 字段_id
    publish_id=1, )
book_obj.save()

 

方式三,通过字典方式。

c_dict = {
    "title":"<<tcp编程从入门到精通2>>",
    "price":88.1,
    "PublishDate":"2020-01-03",
    "comment_num":13,
    "collect_num":78,
    "publish_id":1,
}
models.Book.objects.create(**c_dict)

 

在这里插入图片描述
在这里插入图片描述

posted @ 2021-01-14 16:05  锦麟  阅读(130)  评论(0编辑  收藏  举报