Python学习第135天(Django的ORM多对多查询)
Posted 崆峒山肖大侠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python学习第135天(Django的ORM多对多查询)相关的知识,希望对你有一定的参考价值。
今天总结一下,感觉近期的知识点比较多,但是很多测试是为了测试而测试,不具备实际的使用价值,所以打算开始加快学习进度,粗略听,简单总结,在案例实践的时候进行重点了解,今天主要看的是ORM的多对多查询。
大致有两种方式,一种是使用系统提供的多对多表格,另一种属于自己设定一个表格。自定表格增加比较方便,但查询逻辑不佳,而系统表格查询方便,但是增加内容比较麻烦。
多表操作(多对多):
创建多对多的关系 author= models.ManyToManyField("Author")(推荐)
书籍对象它的所有关联作者 obj=book_obj.authors.all()
绑定多对多的关系 obj.add(*QuerySet)
obj.remove(author_obj)
如果想向第三张表插入值的方式绑定关系: 手动创建第三张表
# class Book_Author(models.Model):
# book=models.ForeignKey("Book")
# author=models.ForeignKey("Author")
Book_Author.objects.create(book_id=2,author_id=3)
实际操作:models
class Book(models.Model): name=models.CharField(max_length=20) price=models.IntegerField() pub_date=models.DateField() publish=models.ForeignKey("Publish") authors=models.ManyToManyField("Author") def __str__(self): return self.name class Publish(models.Model): name=models.CharField(max_length=32) city=models.CharField(max_length=32) def __str__(self): return self.name # class Book_Author(models.Model): # book=models.ForeignKey("Book") # author=models.ForeignKey("Author") class Author(models.Model): name=models.CharField(max_length=32) age=models.IntegerField(default=20) def __str__(self): return self.name
views:(都暂时写在add下面,完全没有教使用方式,只是单纯输出,暂时比较无脑)
#通过对象的方式绑定关系 # book_obj=Book.objects.get(id=3) # print(book_obj.authors.all()) # print(type(book_obj.authors.all())) # # author_obj=Author.objects.get(id=2) # print(author_obj.book_set.all()) # book_obj=Book.objects.get(id=3) # author_objs=Author.objects.all() # #book_obj.authors.add(*author_objs) # # book_obj.authors.remove(*author_objs) # book_obj.authors.remove(4) #创建第三张表 # Book_Author.objects.create(book_id=2,author_id=2) # # obj=Book.objects.get(id=2) # print(obj.book_author_set.all()[0].author) #alex出过的书籍名称及价格 # ret=Book.objects.filter(book_author__author__name="alex").values("name","price") # print(ret) # ret2=Book.objects.filter(authors__name="alex").values("name","price","authors__name") # print(ret2) # ret=Book.objects.all().aggregate(Avg("price")) # ret=Book.objects.all().aggregate(Sum("price")) # ret=Book.objects.filter(authors__name="alex").aggregate(alex_money=Sum("price")) # ret=Book.objects.filter(authors__name="alex").aggregate(Count("price")) # print(ret)
以上内容就是今天的全部内容。
以上是关于Python学习第135天(Django的ORM多对多查询)的主要内容,如果未能解决你的问题,请参考以下文章