1.1对1
何为1对1 2个表互相对照对方 没有其他的表 在生活中常见的1对1关系有
作者和作者信息 一个作者只有一个信息 这个信息只能是这个作者
作者 李白
信息 朝代、年龄、笔名
如果将作者删除那么 信息也会跟着一起删除 两个表是关联的关系
然后是操作
1.查所有的作者 作者下带着资料
@book_router.get("/page/size") async def select_book_page_size(page:int=1,size:int=5): offset=(page-1)*size book=await Book.all().prefetch_related("category").offset(offset).limit(size) book_list = [ { "id": b.id, "name": b.name, "price": b.price, "number": b.number, "category": { "id": b.category.id, "name": b.category.name, "text": b.category.text } } for b in book ] total = len(book_list) return {"message": "查询成功","total":total,"data":book_list}包含分页
offset=(page-1)*size 是分页必写的内容
book=await Book.all().prefetch_related("category").offset(offset).limit(size)
Book.all(). 查找book下的所有内容 prefetch_related("category") 连接到category表
.offset(offset).limit(size) 进行分页
book_list = [] 新建一个表 表中是我们要展示的所有内容 首先是我们的内容
"id": b.id,
"name": b.name,
"price": b.price,
"number": b.number,
外键内容
"category": {
"id": b.category.id,
"name": b.category.name,
"text": b.category.text
}
用for b in book 来循环 b是book里面的每条消息
category中 b.category.id, b下分类下的id就也把另一个表的内容也输出了
1对1的表 查询一个表另一个表的数据也要输出
2.删除1个表另一个也跟着删除
@book_router.delete("/delete_book/{id}") async def delete_book(id:int): book=await Book.filter(id=id).prefetch_related("category").first() if not book: return {"message": "图书不存在"} await book.category.delete() await book.delete() return {"message": "删除成功"}先查到要删除的信息 然后prefetch_related("category") 连接到另一个表
await book.category.delete()
await book.delete()
直接删除 从book连接到category 删除两个表中的数据
2.1对多
1.查询一个表下所有的数据
@day02_book_router.get("/") async def get_book_list(page:int=1,page_size:int=10,keyword:str=None): query=Article.all() if keyword: query = query.filter(Q(title__icontains=keyword) | Q(content__icontains=keyword)) total = await query.count() offset = (page-1)*page_size articles = await query.prefetch_related("category", "author", "tags").offset(offset).limit(page_size) articles_list=[ { "id":article.id, "title":article.title, "summary":article.summary, "content":article.content, "category":{ "id":article.category.id, "name":article.category.name, "description":article.category.description, }, "author":article.author.username, "view_count":article.view_count, "status":article.status, "tags":[tag.name for tag in article.tags], } for article in articles ] return {"code":200,"message":"获取成功","total": total,"data":articles_list}查询当前商品下的信息 包含标签表
"tags":[tag.name for tag in article.tags]
tag 在article.tags 代表每条消息 然后只取name 赋值给tage
tags下有多个信息 然后类别也跟着输出
还可以传page size-page 进行分页 也可以传keyword 进行模糊查询
一个book下的详细信息以及标签就是1对多的查询
2.post添加
@day02_book_router.post("/") async def create_article(article_data: ArticleCreateRequest): data = article_data.dict() tag_id_list = data.pop("tags") category_id = data.pop("category_id") author_id = data.pop("author_id") category = await Category.get(id=category_id) author = await User.get(id=author_id) if not all([category, author]): return {"code": 400, "message": "分类或作者不存在"} article = await Article.create( title=data["title"], content=data["content"], summary=data["summary"], status=data["status"], category=category, author=author ) if tag_id_list: tag_objs = await Tag.filter(id__in=tag_id_list) await article.tags.add(*tag_objs) return {"code": 200, "message": "创建成功", "data": article.id}先新建一个请求体ArticleCreateReques 里面的字段和models的字端相等
data = article_data.dict() 转化为字典 赋值给data 我们要将外键取出来判断再加到表中
tag_id_list = data.pop("tags") category_id = data.pop("category_id") author_id = data.pop("author_id") category = await Category.get(id=category_id) author = await User.get(id=author_id) if not all([category, author]): return {"code": 400,"message":"分类或作者不存在"}将标签 类 作者从data.pop取出来赋值 然后在类表和作者表中查找是否存在 如果存在的话我们就加到article的外键字段中
if tag_id_list: tag_objs = await Tag.filter(id_in=tag_id_list) await article.tags.add(*tag_objs)判断 我们的标签 是否是我们标签表中的内容 如果是我们add加到我们的article中
如果我们传的类 作者 标签 不在我们对应的表中 我们都会显示错误
3.查询当前类下有什么书
@day02_category_router.get("/") async def get_category_list(): categories = await Category.all().prefetch_related("articles") categories_list=[ { "id":category.id, "name":category.name, "description":category.description, "articles_count":len(category.articles), "articles":[ { "id":article.id, "title":article.title, "summary":article.summary, "content":article.content, # "author":article.author.username, "view_count":article.view_count, "status":article.status, # "tags":[tag.name for tag in article.tags], } for article in category.articles ] } for category in categories ] return {"code":200,"message":"获取成功","data":categories_list}categories = await Category.all()-prefetch_related("articles") 查询类的所有内容连接 articles外键
定义一个表categories_list 并把我们类要展示的内容写出来
每个类有什么图书 就是类中包含一个字段是图书 articles
定义一个类 articles ={
"id":article.id,
"title":article.title,
"summary" :article.summary,
"content":article.content,
# "author":article.author.username,
"view_count":article.view_count,
"status":article.status,
# "tags":[tag.name for tag in article.tags],
}
其中author和tags没有连接他们的表所以显示不出来
for article in category.articles
category.articles 类到图书表 每条赋值给articles 然后在articles 字段中以此输出
类id=1 下有有图书 6,8等多条消息都可以在下显示出来