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")
绑定多对多关系
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)
解除多对多关系
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)
查询数据
对象查询: 获取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"))