day2作业笔记
模型
models/articles.py
from tortoise import Model,fields class Category(Model): id=fields.IntField(pk=True,auto_increment=True,description='分类ID') name=fields.CharField(max_length=50,description='分类名称') class Meta: table='db_category' class Author(Model): id=fields.IntField(pk=True,auto_increment=True,description='作者ID') name=fields.CharField(max_length=50,description='作者名称') class Meta: table='db_author' class Article(Model): id=fields.IntField(pk=True,auto_increment=True,description='文章ID') title=fields.CharField(max_length=200,description='文章标题') content=fields.TextField(description='文章内容') summary=fields.CharField(max_length=200,description='文章摘要') category=fields.ForeignKeyField('models.Category',description='分类') author=fields.ForeignKeyField('models.Author',description='作者') tags=fields.ManyToManyField('models.Tag',related_name='articles',description='标签') view_count=fields.IntField(default=0,description='文章浏览量') status=fields.SmallIntField(choices=[(0,'草稿'),(1,'已发布')],default=0,description='文章状态') class Meta: table='db_article'models/tags.py
from tortoise import Model,fields class Tag(Model): id=fields.IntField(pk=True,auto_increment=True,description='标签ID') name=fields.CharField(max_length=50,description='标签名称') color=fields.CharField(max_length=20,default='#409EFF',description='标签颜色') class Meta: table='db_tag'接口
1.分类增删改查功能
from fastapi import APIRouter, HTTPException from pydantic import BaseModel from apps.models import Category category_router=APIRouter() @category_router.get('/category/',tags='获取所有分类') async def get_all_category(): categories=await Category.all() return categories class CategoryCreateRequest(BaseModel): name:str @category_router.post('/category/',tags='新建分类') async def add_category(request:CategoryCreateRequest): category=await Category.create(**request.model_dump()) return category class CategoryUpdateRequest(BaseModel): name:str @category_router.put('category/{id}',tags='编辑分类') async def update_category(id:int,request:CategoryUpdateRequest): category=await Category.get_or_none(id=id) if not category: raise HTTPException(status_code=404,detail='分类不存在') await category.update_from_dict(request.model_dump()).save() return category @category_router.delete('category/{id}',tags='删除分类') async def delete_category(id:int): category=await Category.get_or_none(id=id) await category.delete() return {'message':'删除成功','id':id}2.文章增删改查功能
from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel, computed_field from tortoise.contrib.pydantic import pydantic_model_creator from apps.models import Article, Tag from utils.jwt import login_required article_router=APIRouter() ArticleOut=pydantic_model_creator(Article,name='ArticleOut') class TagOut(BaseModel): id:int name:str color:str class CategoryOut(BaseModel): id:int name:str class AuthorOut(BaseModel): id:int name:str class ArticleListOut(BaseModel): id:int title:str summary:str view_count:int status:int category:CategoryOut author:AuthorOut tags:list[TagOut] @computed_field @property def status_text(self)->str: return '草稿' if self.status==0 else '已发布' @article_router.get('/article/',tags='文章列表(条件筛选)') async def article_list(user=Depends(login_required),category:int=None,title:str=None,): query=Article.all() if category is not None: query=query.filter(category_id=category) if title is not None: query=query.filter(title__contains=title) articles = await query.prefetch_related('category', 'author', 'tags') return [ ArticleListOut( id=a.id, title=a.title, summary=a.summary, view_count=a.view_count, status=a.status, category=CategoryOut(id=a.category.id, name=a.category.name), author=AuthorOut(id=a.author.id, name=a.author.name), tags=[TagOut(id=t.id, name=t.name, color=t.color) for t in a.tags] ) for a in articles ] class ArticleCreateRequest(BaseModel): title:str content:str summary:str category:int tags:list[int] status:int=0 @article_router.post('/article/',tags='新建文章') async def create_article(request:ArticleCreateRequest,user=Depends(login_required)): tag_ids=request.tags data=request.model_dump(exclude={'tags'}) article=await Article.create(**data,author_id=user.id) if tag_ids: tags=await Tag.filter(id__in=tag_ids) await article.tags.add(*tags) return await ArticleOut.from_tortoise_orm(article) class ArticleUpdateRequest(BaseModel): title:str content:str summary:str category:int tags:list[int] status:int=0 @article_router.put('/article/{id}',tags='编辑文章') async def update_article(id:int,request:ArticleUpdateRequest,user=Depends(login_required)): article_id=await Article.get_or_none(id=id) if not article_id: raise HTTPException(status_code=404,detail='文章不存在') tag_ids = request.tags data = request.model_dump(exclude={'tags'}, exclude_none=True) await article_id.update_from_dict(data).save() if tag_ids is not None: tags = await Tag.filter(id__in=tag_ids) await article_id.tags.clear() await article_id.tags.add(*tags) return await ArticleOut.from_tortoise_orm(article_id) @article_router.delete('/article/{id}',tags='删除文章') async def delete_article(id:int,user=Depends(login_required)): article_id=await Article.get_or_none(id=id) if not article_id: raise HTTPException(status_code=404,detail='文章不存在') await article_id.delete() return {'message':'删除成功'}3.标签增删查功能
from fastapi import APIRouter, HTTPException from pydantic import BaseModel, Field from apps.models import Tag tag_router=APIRouter() @tag_router.get('/tag/',tags='获取所有标签') async def tag_list(): tags=await Tag.all() return tags class TagCreateRequest(BaseModel): name:str color:str @tag_router.post('/tag/',tags='创建标签') async def add_tag(request:TagCreateRequest): exists=await Tag.filter(name=request.name).first() if exists: raise HTTPException(status_code=400,detail='标签名称已存在') tag=await Tag.create(**request.model_dump()) return tag @tag_router.delete('/tag/{id}',tags='删除标签') async def delete_tag(id:int): tag=await Tag.get_or_none(id=id) await tag.delete() return {'message':'标签删除成功'}