代码解读
@app.post("/activities/{activity_id}/like", response_model=Like_Pydantic)
async def like_activity(activity_id: int, user: User_Pydantic):
-
@app.post("/activities/{activity_id}/like", response_model=Like_Pydantic)
:这是一个 FastAPI 路由装饰器,定义了一个 POST 请求接口。路径为/activities/{activity_id}/like
,其中{activity_id}
是一个路径参数,表示活动的 ID。response_model=Like_Pydantic
指定了该接口的返回数据模型为Like_Pydantic
,这有助于自动进行数据验证和序列化。 async def like_activity(activity_id: int, user: User_Pydantic):
:定义了一个异步函数like_activity
,它接收两个参数:-
activity_id: int
:活动的 ID,从路径参数中获取。 -
user: User_Pydantic
:用户信息,类型为User_Pydantic
,这是一个 Pydantic 模型,用于验证和处理用户数据。
-
activity = await Activity.get_or_none(id=activity_id)
-
await Activity.get_or_none(id=activity_id)
:使用 Tortoise ORM 的get_or_none
方法异步查询活动表(Activity
),尝试获取id
等于activity_id
的活动记录。如果找到记录,则返回该活动对象;如果没有找到,则返回None
。 -
activity
:存储查询到的活动对象。
if not activity:
raise HTTPException(status_code=404, detail="Activity not found")
-
如果
activity
为None
(即未找到活动),则抛出一个HTTPException
异常,状态码为404
,表示“未找到资源”,并附带详细信息"Activity not found"
。
like, created = await Like.get_or_create(user_id=user.id, activity_id=activity_id)
await Like.get_or_create(user_id=user.id, activity_id=activity_id)
:使用 Tortoise ORM 的get_or_create
方法异步查询点赞表(Like
),尝试获取一个用户(user_id
)对该活动(activity_id
)的点赞记录。-
如果已经存在这样的记录,则返回该记录和
created=False
。 -
如果不存在,则创建一个新的点赞记录,并返回该记录和
created=True
。
-
-
like
:存储查询或创建的点赞记录。 -
created
:布尔值,表示是否创建了新的记录。
if created:
activity.like_count += 1
await activity.save()
- 如果
created
为True
(即新创建了点赞记录),则:-
将活动的
like_count
(点赞数)加 1。 -
调用
await activity.save()
异步保存活动对象的更新。
-
return await Like_Pydantic.from_tortoise_orm(like)
-
await Like_Pydantic.from_tortoise_orm(like)
:将点赞记录(like
)从 Tortoise ORM 对象转换为 Pydantic 模型对象,以便进行序列化和返回。 -
return
:返回转换后的点赞记录数据,作为接口的响应。
总结
这段代码实现了一个点赞功能的接口:
-
接收活动 ID 和用户信息。
-
查询活动是否存在,如果不存在则返回 404 错误。
- 检查用户是否已经对该活动点过赞:
-
如果没有点赞,则创建新的点赞记录,并将活动的点赞数加 1。
-
如果已经点赞,则不做任何操作。
-
-
返回点赞记录的信息。