在FastApi里面使用Tortoise-orm,查询关联表数据(外键、一对多、多对多等)时,可以用select_related和prefetch_related来查询,但是查询的关联数据需要筛选时,就需要用到Prefetch。
举例:用户表-部门表,查询部门时,同时获取部门下的人员列表时,就是一对多关系。
class User(models.Model):
"""用户表"""
id = fields.IntField(pk=True)
name = fields.CharField(max_length=32, index=True)
is_staff = fields.BooleanField(default=False) # 是否是管理员
is_invalid = fields.BooleanField(default=False) # 是否禁用
department = fields.ForeignKeyField("cp_model.Department", on_delete=fields.SET_NULL, null=True,
related_name="depart_users", help_text='所属部门')
class Department(AbstractDefaultColumn):
"""部门表"""
id = fields.CharField(max_length=50, pk=True)
name = fields.CharField(max_length=64, help_text='部门名')
查询部门和部门下的管理人员:
query_set = await Department.all().prefetch_related(
Prefetch("depart_users", queryset=User.filter(is_invalid=False, is_staff=True))
)
这里获取到的query_set里面,每个部门下的depart_users都是筛选过的