Django系列之orm查询

这篇具有很好参考价值的文章主要介绍了Django系列之orm查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

表结构概况

现有四张表,表和表之间有一对一、一对多、多对多的关系,具体表结构如下:

class Publish(models.Model):
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=8)
    email = models.CharField(max_length=16)

    def __str__(self):
        return self.name

class AuthorDetail(models.Model):
    gender = models.CharField(max_length=8)
    birthday = models.DateField()
    telephone = models.BigIntegerField()
    addr = models.CharField(max_length=64)

class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    ad = models.OneToOneField(AuthorDetail, on_delete=models.CASCADE, null=True)

    def __str__(self):
        return self.name

class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    pub_date = models.DateField()
    publish = models.ForeignKey(Publish, on_delete=models.CASCADE, null=True)
    authors = models.ManyToManyField(Author, db_table="book2author")

    def __str__(self):
        return self.title

以下的这些查询,都是没有设置 related_name 参数的前提下做的查询,如果要在有 related_name 参数下查询,可以参考文章 related_name的反向查询文章来源地址https://www.toymoban.com/news/detail-605429.html

一对一查询

# 子查询-正查:查询张三的手机号
queryset = Author.objects.get(name="张三").ad.telephone
# 子查询-反查:查询作者详情id为1的作者名(表名小写)
queryset = AuthorDetail.objects.get(id="1").author.name

# 连表查询-正查:查询张三的手机号
queryset = Author.objects.filter(name='张三').values("ad__telephone")
# 连表查询-反查
queryset = AuthorDetail.objects.filter(author__name="张三").values("telephone")

一对多查询

# 子查询-正查: 查询《大圣归来》这本书的出版社地址
queryset = Book.objects.get(title="大圣归来").publish.name
# 子查询-反查: 查询 人民教育出版社 出版的所有书籍
queryset = Publish.objects.get(name="人民教育").book_set.all()

# 连表查询-正查: 查询《大圣归来》这本书的出版社地址
queryset = Book.objects.filter(title="大圣归来").values("publish__name")
# 连表查询-反查
queryset = Publish.objects.filter(book__title="大圣归来").values("name")  # values和value_list是QuerySet的方法,而不是Object的方法
queryset = Publish.objects.get(book__title="大圣归来").name               # 只有Object才能 .属性

多对多查询

# 子查询-正查:查询《大圣归来了》的所有作者
queryset = Book.objects.get(title="大圣归来了").authors.all().values("name")
# 子查询-反查:查询张三写的所有书籍
queryset = Author.objects.get(name="张三").book_set.all().values("title")

# 连表查询-正查:查询《大圣归来了》的所有作者
queryset = Book.objects.filter(title="大圣归来了").values("authors__name")
# 连表查询-反查
queryset = Author.objects.filter(book__title="大圣归来了").values("name")

跨多张表联合查询

# 查询:南方教育出版社 出版过的所有书籍的名字以及作者的姓名
queryset = Publish.objects.filter(name="南方教育").values("book__title", "book__authors__name")
queryset = Book.objects.filter(publish__name="南方教育").values("title", "authors__name")
queryset = Author.objects.filter(book__publish__name="南方教育").values("name", "book__title")

# 查询:手机号包含8的作者出版过的所有书籍名称以及出版社名称
queryset = Publish.objects.filter(book__authors__ad__telephone__contains='8').values("name", "book__title")
queryset = AuthorDetail.objects.filter(telephone__contains="8").values("author__book__title", "author__book__publish__name")
queryset = Book.objects.filter(authors__ad__telephone__contains="8").values("title", "publish__name")

聚合分组查询

""" 聚合查询 """
# 计算所有图书的平均价格
queryset = Book.objects.all().aggregate(avg_price=Avg("price"))

# 计算所有图书的作者的平均年龄
queryset = Book.objects.all().aggregate(avg_age=Avg("authors__age"))


""" 分组查询: 按哪个字段分组,values就是那个值 """
# 查询每一个作者出版的书的数量
queryset = Book.objects.values("authors").annotate(cnt=Count("*"))

# 查询每一个作者的名字以及出版书籍的个数
queryset = Author.objects.values("name").annotate(pub_count=Count("book"))

# 查询每一个出版社的名字和出版过的书籍的平均价格
queryset = Publish.objects.values("name").annotate(avg_price=Avg("book__price"))

# 查询每一个书籍的名称以及作者的个数
queryset = Book.objects.values("title").annotate(author_count=Count("authors")).values("title", "author_count")

# 查询作者个数大于1的每一本书籍的名称和作者个数
# 如果不写values的话,就默认按照id分组
queryset = Book.objects.annotate(author_cnt=Count("authors")).filter(author_cnt__gt=1).values("title", "author_cnt")

# 查询书籍名称包含 "h" 的书籍名称和作者个数(先筛选再连表查)
queryset = Book.objects.filter(title__contains="h").annotate(book_cnt=Count("authors")).values("title", "book_cnt")

F查询和Q查询

""" F 查询: 针对某一列进行运算或其他操作 """
# 查询评论数大于2倍点赞数的文章
queryset = Article.objects.filter(comment_num__gt=F("poll_num")*2)
# 对数据库做修改操作:将所有的书籍的价格提高100元
queryset = Book.objects.update(price=F("price")+100)

""" Q查询:多个条件的and、or、not操作 """
# or:查询价格大于300或者名称以p开头的书籍
queryset = Book.objects.filter(Q(price__gt=300) | Q(title__startswith="p"))
# and: 查询价格大于300并且名称以p开头的书籍
queryset = Book.objects.filter(Q(price__gt=300) & Q(title__startswith="大圣"))       # 下面两者是等价的
queryset = Book.objects.filter(price__gt=300, title__startswith="大圣")

到了这里,关于Django系列之orm查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Django系列之orm查询

    现有四张表,表和表之间有一对一、一对多、多对多的关系,具体表结构如下: 以下的这些查询,都是没有设置 related_name 参数的前提下做的查询,如果要在有 related_name 参数下查询,可以参考文章 related_name的反向查询

    2024年02月15日
    浏览(40)
  • Django基础入门⑩:Django查询数据库操作详讲

    🏘️🏘️个人简介:以山河作礼。 🎖️🎖️: Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主,CSDN内容合伙人 🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读! 🎁🎁: 文章末尾扫描二维码可以加入粉丝交流群,不定期免费送书。 添加数据 存储

    2024年02月13日
    浏览(54)
  • 【Django入门系列】数据库操作

    在本章中,我们将学习在Django中进行数据库操作的基础知识。我们将探讨Django中的数据库支持、定义和迁移数据库模型、使用Django的ORM进行数据库查询以及数据库关系和查询优化。 Django提供了对多种关系型数据库的支持,包括常见的MySQL、PostgreSQL和SQLite等。你可以在项目的配

    2024年02月12日
    浏览(57)
  • Django笔记二十八之数据库查询优化汇总

    本文首发于公众号:Hunter后端 原文链接:Django笔记二十八之数据库查询优化汇总 这一篇笔记将从以下几个方面来介绍 Django 在查询过程中的一些优化操作,有一些是介绍如何获取 Django 查询转化的 sql 语句,有一些是理解 QuerySet 是如何获取数据的。 以下是本篇笔记目录: 性

    2023年04月22日
    浏览(83)
  • 问题解决:django模型查询报错,找不到数据库表

    django项目,使用的postgresql数据库,建了多个模式,模型查询时一直默认查public的表 1. 问题 :   django.db.utils.ProgrammingError: relation \\\"ip_management_app.table\\\" does not exist 2. 代码: 3. 解决方案 (1)使用的django2.0,settings文件中修改数据库配置,增加OPTIONS (2)其他方案 修改db_table,有

    2024年01月23日
    浏览(57)
  • Django笔记二十一之使用原生SQL查询数据库

    本文首发于公众号:Hunter后端 原文链接:Django笔记二十一之使用原生SQL查询数据库 Django 提供了两种方式来执行原生 SQL 代码。 一种是使用 raw() 函数,一种是 使用 connection.cursor()。 但是官方还是推荐在使用原生 SQL 之前,尽量的先去探索一下 QuerySet 提供的各种 API。 目前而言

    2023年04月10日
    浏览(61)
  • 【python】Django——连接mysql数据库

    笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 【Django专栏】 Django——django简介、django安装、创建项目、快速上手 Django——templates模板、静态文件、django模板语法、请求和响应 Django——连接mysql数据库 ORM(Object-Relational Mapping)是一种编程技术,它允许开发者使用面

    2024年02月04日
    浏览(58)
  • Python Django 之连接 Mysql 数据库详解

    博客:https://blog.csdn.net/qq_34745941/article/details/122549376 若已安装,请忽略。 主要使用的文件如图 若 pip 安装失败,可进入 Python 官方库中下载 whl 文件,操作可参考: 博客:https://blog.csdn.net/qq_34745941/article/details/106341898 在 settings.py 中,配置 Mysql 的连接串 扩展: Django 也支持其

    2024年02月04日
    浏览(55)
  • python+django迁移数据库成功但是数据库中还没表产生

    1、删除原来的文件(我这没了,反正就是之前执行下面两条命令生成的文件) 2、检查settings.py中DATABASES参数,首先是数据库的信息对不对。我这里是因为ENGINE=“django.db.backends.sqlite3” 因为我使用的数据库是mysql,所以修改成“django.db.backends.mysql”就好了,就这搞了一天,真

    2024年02月11日
    浏览(70)
  • python#django数据库一对一/一对多/多对多

    搭建 # 一对一 class   TestUser(models.Model):     username=models.CharField(max_length=32)     password = models.CharField(max_length=32) class TestInfo(models.Model):     mick_name=models.CharField(max_length=32)     user=models.OneToOneField(to=TestUser,on_delete=models.CASCADE()#on_delete 删除的模式 CASCADE 级联删除 让后执行数

    2024年02月14日
    浏览(78)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包