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)
View Code
复制代码

 

第二种方式:手动创建第三张表,不推荐

复制代码
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')
View Code
复制代码

 

补充:

如果想向第三张表插入的方式绑定关系:手动创建第三张表

复制代码
关联字段
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")
View Code
复制代码

 

 

绑定多对多关系

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
对象查询:
 
获取id3的书籍的作者信息
book_obj=Book.objects.get(id=3)
book_obj.authors.all()
 
获取id2的作者写的书的信息
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"))
View Code
复制代码

 

posted @   -零  阅读(286)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示