fastapi项目 06-新增项目接口,序列化查询结果

发布时间 2024-01-06 15:26:57作者: dack_deng

前言

新增项目,一般都会记录是哪个用户新建的,往往一个用户可以新建多个项目,于是数据库模型就可以建立一对多的关系。

1. 新建数据库模型(一对多)

# apps/model/models.py  

class User(DbModel)
    ......
    # 一对多
    projects = relationship('Project', backref='user', cascade='all,delete')


class Project(DbModel):
    """项目信息"""
    __tablename__ = 'project'
    id = Column(Integer, primary_key=True, autoincrement=True)
    project_name = Column(String(100), unique=True, nullable=False)
    publish_app = Column(String(100), nullable=True)
    project_des = Column(String(600), nullable=True)
    active = Column(Enum("1", "0"), default="1", nullable=True)
    # 所属用户
    user_id = Column(Integer, ForeignKey('user.id'))

新增数据库模型后,就可以进行表的迁移:

  • alembic revision --autogenerate -m "test" # 自定义迁移文件名
  • alembic upgrade head
    迁移成功后,就可以在数据库中查看到新建了数据库表project。

1.1 新增crud

# apps/routers/crud.py  
from apps.model.models import User, Project

def create_project(db: Session, body):
    db_project = Project(**body.dict())
    # 先判断是否存在,在入库
    if db.query(Project).filter_by(project_name=db_project.project_name).count():
        # 项目名称重复添加
        raise HTTPException(status_code=400, detail=f'项目名称:{body.project_name},已存在')
    try:
        db.add(db_project)
        db.commit()
        db.refresh(db_project)
    except Exception as e:
        print(f"数据写入失败:{e}")
        raise HTTPException(status_code=400, detail='添加项目失败!')
    return db_project

创建新建项目的接口函数,并约定数据输入和输出模型。
我们先建立数据的输入和输出模型。

# apps/model/schemas.py
class ProjectIn(BaseModel):
    project_name: str = Field(..., max_length=100, description="项目名称")
    publish_app: str = Field(None, max_length=100)
    project_des: str = Field(None, max_length=600)
    user_id: int = Field(None)

class ProjectOut(BaseModel):
    id: int
    project_name: str
    project_app: str = ''
    project_des: str = ''
    active: str = '1'
    user_id: int = ''

    class Config:
        orm_mode = True  # 将查询到的orm对象,转换成json
# apps/routers/view_project.py

from fastapi import APIRouter, Depends
from fastapi_jwt_auth import AuthJWT
from apps.dependency import get_db
from sqlalchemy.orm import Session
from apps.model.schemas import ProjectIn, ProjectOut
from apps.model.crud import create_project

router = APIRouter()

@router.post("/project", response_model=ProjectOut)
async def create_project_demo(
        body: ProjectIn,
        Authorize: AuthJWT = Depends(),
        db: Session = Depends(get_db)
):
    """新增项目数据"""
    Authorize.jwt_required()  # 需要先登录才能请求该接口
    # 获取额外的数据
    user_claims= Authorize.get_raw_jwt()
    # 得到用户名
    print(f'用户名:{user_claims["username"]}')
    body.user_id = user_claims["id"]
    res = create_project(db, body)

    return res

工厂函数create_app中,注册路由。

# 注册路由
app.include_router(view_project.router, prefix="/api/v1", tags=["项目"])