AI掘金头条新闻系统 (Toutiao News)-获取收藏列表
·
1. schemas/base.py
from datetime import datetime
from typing import Optional
from pydantic import BaseModel, Field, ConfigDict
class NewsItemBase(BaseModel):
id: int
title: str
description: Optional[str] = None
image: Optional[str] = None
author: Optional[str] = None
category_id: int = Field(alias="categoryId")
views: int
publish_time: Optional[datetime] = Field(None, alias="publishedTime")
model_config = ConfigDict(
from_attributes=True,
populate_by_name=True
)
2. schemas/favorite.py
# 收藏列表接口响应模型类
class FavoriteListResponse(BaseModel):
list: list[FavoriteNewsItemResponse]
total: int
has_more: bool = Field(alias="hasMore")
model_config = ConfigDict(
populate_by_name=True,
from_attributes=True
)
3. crud/favorite.py
# 获取收藏列表:获取的是某个用户的收藏列表 + 分页功能
async def get_favorite_list(
db: AsyncSession,
user_id: int,
page: int = 1,
page_size: int = 10
):
# 总量 + 收藏的新闻列表
count_query = select(func.count()).where(Favorite.user_id == user_id)
count_result = await db.execute(count_query)
total = count_result.scalar_one()
# 获取收藏列表 - 联表查询 join() + 收藏时间排序 + 分页
# select(查询主体模型类, 字段别名).join(联合查询的模型类, 联合查询的条件).where().order_by().offset().limit()
# 别名: Favorite.created_at.label("favorite_time")
offset = (page - 1) * page_size
# [
# (新闻对象, 收藏时间, 收藏id)
# ]
query = (select(News, Favorite.created_at.label("favorite_time"), Favorite.id.label("favorite_id"))
.join(Favorite, Favorite.news_id == News.id)
.where(Favorite.user_id == user_id)
.order_by(Favorite.created_at.desc())
.offset(offset).limit(page_size)
)
result = await db.execute(query)
rows = result.all()
return rows, total
4. routers/favorite.py
# 获取收藏列表
@router.get("/list")
async def get_favorite_list(
page: int = Query(1, ge=1),
page_size: int = Query(10, ge=1, le=100, alias="pageSize"),
user: User = Depends(get_current_user),
db: AsyncSession = Depends(get_db)
):
rows, total = await favorite.get_favorite_list(db, user.id, page, page_size)
favorite_list = [{
**news.__dict__,
"favorite_time": favorite_time,
"favorite_id": favorite_id
} for news, favorite_time, favorite_id in rows]
has_more = total > page * page_size
data = FavoriteListResponse(list=favorite_list, total=total, hasMore=has_more)
return success_response(message="获取收藏列表成功", data=data)更多推荐
所有评论(0)