跳至内容

选择字段

Prisma Client Python 支持选择模型的子集字段,以在适用时提高性能和安全性,例如,如果您的模型上有一个 hashed_password 字段。

目前,您必须提前定义选择,并且不能动态选择字段。这是因为使用动态语法无法静态类型化查询。有关潜在解决方案的讨论,请参阅 此问题

用法

您可以通过两种方式定义可用于选择特定字段子集的模型类型。

提示

虽然这里概述了两种方法的优缺点,但由于您编写查询的方式不会改变,因此在两种方法之间切换应该相当简单。

第一种方法是使用 部分类型,当以下情况时应使用此方法:

  • 您计划使用该特定模型编写多个查询
  • 您知道您将对数据模型进行大量迭代,因为部分类型会随着模型的演变而无缝演变

第二种方法是 自己定义模型,这使得编写一次性查询或仅针对应用程序/数据模型的较小部分的查询变得更容易。

展开以显示示例 Prisma 模式
model User {
  id      String @id @default(cuid())
  name    String
  country String
}

model Characters {
  id       String @id @default(cuid())
  name     String
  strength Int
}

使用部分类型

注意

如果您不熟悉 部分类型,请先阅读 文档

您定义的任何部分类型也可以用于运行查询,例如

# partial type generator (e.g. `prisma/partial_types.py`)
from prisma.models import User

User.create_partial('UserWithName', include={'name'})

更新部分类型生成器并运行prisma generate后,您可以像这样导入类型

from prisma.partials import UserWithName

有关使用示例,请参阅 编写查询 部分。

使用自定义模型

要定义您自己的自定义模型,您必须从prisma.bases导入基本模型。所有基类都是使用Base${model_name}格式定义的。

例如,具有Comment模型的模式将定义一个名为BaseComment的基类。

然后,您可以像使用 pydantic 一样定义您自己的模型。

例如,您可以像这样定义一个仅选择name字段的User模型

from prisma.bases import BaseUser

class UserWithName(BaseUser):
  name: str

有关使用示例,请参阅 编写查询 部分。

编写查询

您可以使用与使用从prisma.models导入的 模型 编写查询时相同的语法编写选择查询。

user = await UserWithName.prisma().find_first(
  where={
    'country': 'Scotland',
  },
)
print(user.name)

如果您尝试访问自定义模型中不存在的字段,类型检查器将报告错误,并且在运行时将引发错误。

print(user.id)  # error `id` does not exist on the `UserWithName` type

如您所见,您仍然可以查询未在模型本身中定义的字段,但 Prisma Client Python 仅选择存在的字段。

有关编写查询的更多详细信息,请参阅 模型操作 文档。

与关系字段的交互

警告

此功能处于实验阶段,可能会发生变化。有关讨论,请参阅 此问题

在某些情况下,如果您编写了许多需要反复获取相同关系的查询,则必须在include中显式指定它们可能会很麻烦且容易出错。

您可以通过将类型定义为非可选来告诉 Prisma Client Python 始终获取一对多关系,例如

from typing import List
from prisma.models import Character
from prisma.bases import BaseUser

class UserWithCharacters(BaseUser):
  id: str
  name: str
  characters: List[Character]

user = await UserWithCharacters.prisma().find_unique(
  where={
    'id': '<user id>',
  },
)
print(user.name)
print(user.characters[0].strength)

使用此UserWithCharacters定义,只要您使用UserWithCharacters模型运行查询,Prisma Client Python 就会始终获取characters关系。

警告

不要在代码库的每个地方都使用此模式。关系查找可能很昂贵,如果使用不当会导致性能显着下降。

注意

目前无法将此模式与一对一关系字段一起使用,如果您希望支持此功能,请点赞或评论 此问题