Django之Models(三)
Django之Models(三)
创建多对多关系
第一种方式:创建多对多的关系authors=models.ManyToManyField("Author")

class Publisher(models.Model): name = models.CharField(max_length=30) city = models.CharField('城市',max_length=60) class Book(models.Model): name=models.CharField(max_length=20) price=models.IntegerField() pub_date=models.DateField() publisher= models.ForeignKey(Publisher,on_delete=models.SET) authors=models.ManyToManyField("Author") class Author(models.Model): name=models.CharField(max_length=32) address=models.CharField(max_length=32)
第二种方式:手动创建第三张表,不推荐

class Publisher(models.Model): name = models.CharField(max_length=30) city = models.CharField('城市',max_length=60) class Book(models.Model): name=models.CharField(max_length=20) price=models.IntegerField() pub_date=models.DateField() publisher= models.ForeignKey(Publisher,on_delete=models.SET) class Author(models.Model): name=models.CharField(max_length=32) address=models.CharField(max_length=32) class Book_Author(models.Model): book=models.Foreignkey('Book') author=models.Foreignkey('Author')
补充:
如果想向第三张表插入的方式绑定关系:手动创建第三张表

关联字段 Book_Author.objects.create(book_id=2,authos_id=3) book_obj=Book.objects.get(id=2) #借助第三张表来查询关联信息 print(book_obj.Book_author_set.all()[0].author) lili出过的书籍名称及价格 第三张表_关联表_字段 Book.objects.filter(book_author_author_name="lili")
绑定多对多关系
1 2 3 4 5 6 7 8 | book_obj = Book.objects.get( id = 2 ) authoor_obj = Author.objects.get( id = 2 ) book_obj.authors.add(author_obj) book_obj = Book.objects.get( id = 2 ) authoor_objs = Auther.objects. all () book_obj.authors.add( * author_objs) |
解除多对多关系
1 2 3 4 5 6 7 8 9 | book_obj = Book.objects.get( id = 2 ) authoor_objs = Auther.objects. all () book_obj.authors.remove( * author_objs) book_obj = Book.objects.get( id = 2 ) authoor_obj = Author.objects.get( id = 2 ) book_obj.authors.remove(authoor_obj) |
查询数据
1 2 3 4 5 6 7 8 9 | 对象查询: 获取 id 为 3 的书籍的作者信息 book_obj = Book.objects.get( id = 3 ) book_obj.authors. all () 获取 id 为 2 的作者写的书的信息 author_obj = Author.objects.get( id = 2 ) author_obj.book_set. all () |
掌握:通过 filter values (双下划线)进行多对多的关联查询
#正向查找(条件)之多对多 ret1=models.Book.objects.filter(name='python').values('author__name') print(ret1) ret2=models.Book.objects.filter(author__name="lili").values('name') print(ret2) #反向查找之多对多: ret3=models.Author.objects.filter(book__name='python').values('name') print(ret10)
聚合与分组

聚合 先导入:from django.db.models import Avg,Min,Max,Count ggregate(*args,**kwargs): 通过对QuerySet进行计算,返回一个聚合值的字典。aggregate()中每一个参数都指定一个包含在字典中的返回值。即在查询集上生成聚合。 ret1=Book.object.all().aggregate(Avg('price')) print(ret1) ret2=ret1=Book.object.all().aggregate(Sum('price')) print(ret2) Book.objects.filter(authors_name="lili").aggregate(Sum("price")) Book.objects.filter(authors_name="lili").aggregate(lili_money=Sum("price")) Book.objects.filter(authors_name="lili").aggregate(Count('price')) 分组 annotate(*args,**kwargs): 可以通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合。 Book.objects.values("authors_name").annotate(Sum("price")) Publish.objects.values('name').annotate(Min("book_price"))
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?