86 lines
2.7 KiB
Python
86 lines
2.7 KiB
Python
"""
|
||
素材分类 CRUD
|
||
==============
|
||
"""
|
||
|
||
from sqlalchemy import select
|
||
from sqlalchemy.ext.asyncio import AsyncSession
|
||
|
||
from app.crud.base import CRUDBase
|
||
from app.models.broll_category import BrollCategory
|
||
|
||
|
||
class BrollCategoryCRUD(CRUDBase[BrollCategory]):
|
||
"""素材分类数据访问"""
|
||
|
||
def __init__(self) -> None:
|
||
super().__init__(BrollCategory)
|
||
|
||
async def get_by_name_and_level(
|
||
self, db: AsyncSession, *, name: str, level: int
|
||
) -> BrollCategory | None:
|
||
"""根据名称和层级获取启用的分类"""
|
||
result = await db.execute(
|
||
select(BrollCategory).where(
|
||
BrollCategory.name == name,
|
||
BrollCategory.level == level,
|
||
BrollCategory.status == "active",
|
||
)
|
||
)
|
||
return result.scalar_one_or_none()
|
||
|
||
async def get_by_names_and_level(
|
||
self, db: AsyncSession, *, names: list[str], level: int
|
||
) -> list[BrollCategory]:
|
||
"""批量根据名称和层级获取启用的分类"""
|
||
if not names:
|
||
return []
|
||
result = await db.execute(
|
||
select(BrollCategory).where(
|
||
BrollCategory.name.in_(names),
|
||
BrollCategory.level == level,
|
||
BrollCategory.status == "active",
|
||
)
|
||
)
|
||
return list(result.scalars().all())
|
||
|
||
async def get_children_by_parent_id(
|
||
self, db: AsyncSession, *, parent_id: int, level: int
|
||
) -> list[BrollCategory]:
|
||
"""根据父分类 ID 和层级获取启用的子分类"""
|
||
result = await db.execute(
|
||
select(BrollCategory).where(
|
||
BrollCategory.parent_id == parent_id,
|
||
BrollCategory.level == level,
|
||
BrollCategory.status == "active",
|
||
)
|
||
)
|
||
return list(result.scalars().all())
|
||
|
||
async def get_by_name_like_and_level(
|
||
self, db: AsyncSession, *, name: str, level: int
|
||
) -> BrollCategory | None:
|
||
"""根据名称模糊匹配和层级获取启用的分类(LIKE %name%)"""
|
||
result = await db.execute(
|
||
select(BrollCategory).where(
|
||
BrollCategory.name.like(f"%{name}%"),
|
||
BrollCategory.level == level,
|
||
BrollCategory.status == "active",
|
||
)
|
||
)
|
||
return result.scalar_one_or_none()
|
||
|
||
async def get_by_level(self, db: AsyncSession, *, level: int) -> list[BrollCategory]:
|
||
"""根据层级获取所有启用的分类"""
|
||
result = await db.execute(
|
||
select(BrollCategory).where(
|
||
BrollCategory.level == level,
|
||
BrollCategory.status == "active",
|
||
)
|
||
)
|
||
return list(result.scalars().all())
|
||
|
||
|
||
# 导出实例
|
||
broll_category = BrollCategoryCRUD()
|