ORM跨表查询总结

一、基于对象的查询-->子查询

1、一对多

正向查询:基于 字段

反向查询:基于 表名__set.all() 注意:表名全部小写

2、多对多

正向查询:基于 字段.all()

反向查询:基于 表名_set.all() 注意:表名全部小写

3、一对一

正向查询:基于 字段

反向查询:基于 表名 注意:表名全部小写

二、基于QuerySet的查询-->连表
1、正向查找: 字段
2、反向查找: 表名

注意:基于QuerySet的查找最重要的是找到基表,filter和values都可以进行跨表查找

query

直接查看ORM对应的SQL语句

三、聚合分组

1、聚合

聚合被称为终止QuerySet函数,返回值是字典

2、分组

a、QuerySet.annotate(),annotate()前面的内容相当于,group by 条件

b、annotate()的返回值是QuerySet 后面加values() 相当于sql语句select 字段

c、annotate()里的内容 聚合函数+连表

Author.objects.values(addr='nj').annotate(a= Count('book')).values(a__gt=2)

 

转载于:https://www.cnblogs.com/wt7018/p/11351846.html

<think>好的,用户想了解如何使用Tortoise ORM进行过滤查询。首先,我需要回忆一下Tortoise ORM的基本用法,特别是过滤查询相关的部分。记得Tortoise ORM是基于Python的异步ORM,所以它的API设计可能和Django的ORM类似,但有一些异步的特性。 首先,用户提到了filter方法的使用,可能需要给出基本的语法和示例。Tortoise ORM中,模型的管理器通常使用filter来添加查询条件。例如,User.filter(name="John")这样的形式。但要注意,filter返回的是查询集,需要配合执行方法如.all()或.first()来获取结果。 接下来,可能需要介绍不同的过滤条件,比如等于、不等于、包含、范围比较等。比如使用双下划线语法,比如age__gt=18示年龄大于18。需要列举常见的查询操作符,如exact、iexact、contains、in、gt、gte等,并给出对应的示例。 然后,用户可能需要组合多个条件的情况,比如如何用Q对象进行逻辑或和非的操作。比如,Q(name="John") | Q(age=25)这样的组合。这部分需要说明Q对象的用法,以及如何与filter方法结合使用。 另外,关联模型的过滤查询也是一个重要部分。例如,通过外键关系查询相关模型的数据,比如查询所有发布了某本书的作者。这里需要演示如何使用双下划线来模型查询,例如Book.filter(author__name="John")。 还要注意异步执行的问题,Tortoise ORM是异步的,所以在查询时需要await关键字,并且要在async函数中执行。示例代码中应该包含async函数的结构,比如async def get_users(): ...。 然后,根据用户提供的引用内容,引用[2]提到了排序功能,可能需要在过滤查询后添加排序,比如.order_by("age"),但用户的问题主要是过滤,这部分可能作为补充提到。 最后,需要验证示例代码的正确性,确保语法正确,比如模型的定义是否正确,字段名称是否匹配,查询条件是否正确使用双下划线等。同时,要检查是否需要导入相关模块,比如Q对象和模型类。 可能还需要考虑用户的实际应用场景,比如在FastAPI中使用Tortoise ORM进行过滤查询,所以示例代码可能需要放在路由处理函数中,并配合await使用。但用户的问题更偏向于基础的过滤方法,所以示例可能不需要涉及Web框架,只需展示核心的ORM操作。 总结一下,回答的结构应该是先介绍基本用法,然后详细说明各种过滤条件,接着是组合查询和关联查询,最后给出示例代码,并提醒异步执行的必要性。同时,生成的相关问题要围绕Tortoise ORM的其他查询功能,比如排序、分页、复杂查询等。</think>### 如何使用Tortoise ORM进行过滤查询? Tortoise ORM提供了灵活的过滤查询功能,通过`filter()`方法结合查询参数可实现精确或模糊的条件筛选。以下是具体使用方法及示例: --- #### 1. **基础过滤语法** 使用`filter(**kwargs)`方法传递字段条件,返回查询集(QuerySet),需配合`.all()`或`.first()`执行查询: ```python from models import User # 假设已定义User模型 async def get_users(): # 查询name为"John"的所有用户 users = await User.filter(name="John").all() # 查询age等于25的第一个用户 user = await User.filter(age=25).first() ``` --- #### 2. **常见过滤条件** 通过字段后缀(双下划线`__`)指定查询操作符: | 操作符 | 说明 | 示例 | |---------------|-----------------------|-------------------------------| | `exact` | 精确匹配(默认) | `name__exact="John"` | | `iexact` | 不区分大小写精确匹配 | `name__iexact="john"` | | `contains` | 包含字符串 | `name__contains="jo"` | | `icontains` | 不区分大小写包含 | `name__icontains="JO"` | | `in` | 值在列中 | `age__in=[18, 25, 30]` | | `gt`/`gte` | 大于/大于等于 | `age__gt=18` | | `lt`/`lte` | 小于/小于等于 | `age__lte=30` | | `isnull` | 字段是否为null | `email__isnull=True` | **示例代码:** ```python # 查询年龄大于18且包含"example.com"邮箱的用户 users = await User.filter( age__gt=18, email__icontains="example.com" ).all() ``` --- #### 3. **组合条件查询** 使用`Q`对象实现逻辑组合(AND/OR/NOT): ```python from tortoise.expressions import Q # 查询name为"John" OR age等于25的用户 users = await User.filter( Q(name="John") | Q(age=25) ).all() # 查询邮箱不为空且年龄不在[18, 25]的用户 users = await User.filter( Q(email__isnull=False) & ~Q(age__in=[18, 25]) ).all() ``` --- #### 4. **关联模型过滤** 通过外键或反向关系模型查询: ```python from models import Author, Book # 查询作者名为"Jane"的所有书籍 books = await Book.filter(author__name="Jane").all() # 查询评分大于4.5的书籍对应的作者 authors = await Author.filter(books__rating__gt=4.5).all() ``` --- #### 5. **完整示例** 假设模型定义如下: ```python from tortoise.models import Model from tortoise import fields class User(Model): id = fields.IntField(pk=True) name = fields.CharField(max_length=50) age = fields.IntField() email = fields.CharField(max_length=100, null=True) ``` **过滤查询示例:** ```python async def query_demo(): # 查询年龄在20-30之间或邮箱包含"gmail.com"的用户,按年龄降序排列 users = await User.filter( Q(age__gte=20, age__lte=30) | Q(email__icontains="gmail.com") ).order_by("-age").all() ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值