async def create(self, obj_in: CreateSchemaType, exclude: set[str] | None = None) -> ModelType: # 创建新记录
if isinstance(obj_in, dict): # 创建数据的 Pydantic 模型
obj_dict = obj_in # 将字典转换为 Pydantic 模型
else:
obj_dict = obj_in.model_dump(exclude_unset=True, exclude_none=True, exclude=exclude) # 排除的字段
obj: ModelType = self.model(**obj_dict) # 创建一个新记录
await obj.save() # 保存到数据库
return obj # 返回新记录
这段代码定义了一个异步方法 create
,用于创建新的数据库记录。以下是逐行解读:
1. async def create(self, obj_in: CreateSchemaType, exclude: set[str] | None = None) -> ModelType:
-
作用:定义一个异步方法
create
,用于创建新记录。 - 参数:
-
obj_in: CreateSchemaType
:表示创建数据的 Pydantic 模型。 -
exclude: set[str] | None = None
:表示需要排除的字段,可以是字符串的集合。
-
-
返回值:返回创建的数据库模型对象(
ModelType
)。
2. if isinstance(obj_in, dict):
-
作用:判断
obj_in
是否是一个字典。 -
解释:如果
obj_in
是字典,直接使用它;否则,将其转换为字典。
3. obj_dict = obj_in
-
作用:如果
obj_in
是字典,直接将其赋值给obj_dict
。 -
解释:
obj_dict
是一个字典,用于存储创建记录所需的数据。
4. else:
-
作用:如果
obj_in
不是字典,进入else
分支。
5. obj_dict = obj_in.model_dump(exclude_unset=True, exclude_none=True, exclude=exclude)
-
作用:将
obj_in
(Pydantic 模型)转换为字典。 - 解释:
-
model_dump
是 Pydantic 提供的方法,用于将模型转换为字典。 -
exclude_unset=True
:排除未设置的字段。 -
exclude_none=True
:排除值为None
的字段。 -
exclude=exclude
:排除指定的字段(由exclude
参数提供)。
-
6. obj: ModelType = self.model(**obj_dict)
-
作用:使用
obj_dict
创建一个新的数据库模型对象。 - 解释:
-
self.model
是数据库模型类。 -
**obj_dict
将字典中的键值对展开为关键字参数,用于初始化模型对象。
-
7. await obj.save()
-
作用:将创建的模型对象保存到数据库。
- 解释:
-
save
是 Tortoise ORM 提供的方法,用于将模型对象保存到数据库。 -
await
表示这是一个异步操作,需要等待数据库操作完成。
-
8. return obj
-
作用:返回创建的模型对象。
-
解释:返回保存到数据库后的模型对象,通常包含生成的主键(如
id
)。
示例
假设有一个数据库模型 Api
和对应的 Pydantic 模型 ApiCreate
:
from pydantic import BaseModel
from tortoise.models import Model
from tortoise.fields import IntField, CharField, BooleanField
class Api(Model):
id = IntField(pk=True)
name = CharField(max_length=50)
description = CharField(max_length=200)
active = BooleanField(default=True)
class ApiCreate(BaseModel):
name: str
description: str
active: bool = True
使用 CRUDBase
创建记录:
api_controller = ApiController() # 假设 ApiController 继承自 CRUDBase
# 前端发送的数据
data = {
"name": "example",
"description": "This is an example",
"active": True
}
# 创建记录
created_api = await api_controller.create(obj_in=data)
总结
create
方法的主要流程是:
-
接收前端发送的数据(可以是字典或 Pydantic 模型)。
-
将数据转换为字典。
-
使用字典创建数据库模型对象。
-
将模型对象保存到数据库。
-
返回保存后的模型对象。
这种方法可以灵活地处理不同来源的数据(如前端表单数据),并通过 Pydantic 模型进行数据验证,确保数据的正确性和一致性。