本篇内容介绍了“Django 怎么实现外键查询”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
一、一对多
二、多对多(返回的内部是相关类的对象的查询集)
创建三张表,详情如下:
class Publish(models.Model): id = models.AutoField(primary_key=True, auto_created=True) pname = models.CharField(max_length=40) city = models.CharField(max_length=50) def __str__(self): return self.pname class Author(models.Model): id = models.AutoField(primary_key=True, auto_created=True) aname = models.CharField(max_length=10) def __str__(self): return self.aname class Book(models.Model): id = models.AutoField(primary_key=True, auto_created=True) bname = models.CharField(max_length=30) price = models.IntegerField() publish = models.ForeignKey(Publish, on_delete=models.CASCADE) author = models.ManyToManyField(Author) def __str__(self): return self.bname
通过类属性进行查询
# get方法的到的结果是一个对应类的对象 # 查询某本书的出版社名字 book = Book.objects.get(id=1) book.publish.pname # 查询某出版社下面有多少本书 # 此处的book是Book这张表的表名的小写(必须是小写)加上_set pub = Publish.objects.get(id=1) pub.book_set.all()
通过Django的双下划线(__)来进行查询
# 通过出版社的相关信息进行查询某一本书 Book.objects.filter(publish__city='北京') Book.objects.filter(publish__id=1) # 通过书籍的相关信息进行查询其出版社 # 此处的book是Book这张表的表名的小写(必须是小写) Publish.objects.filter(book__id=1) # 在values以及values_list中使用(必须加引号) # 通过书籍的相关信息进行查询其出版社 # values得到的结果是一个内部是字典的查询集 Book.objects.filter(id=1).values('publish__pname') # values__list得到的结果是一个内部是元祖的查询集 Book.objects.filter(id=1).values_list('publish__pname') # 通过出版社的相关信息进行查询某一本书 Publish.objects.filter(id=1).values('book__bname') Publish.objects.filter(id=1).values_list('book__bname')
在使用多对多时,Django会自动创建额外的一张表来存储其相对关系。这里额外的一张表的表名是blogs_book_author。
# 通过作者的相关信息查询其某一本书(返回的内部是Book的对象的查询集) Book.objects.filter(author__id=1) Author.objects.filter(id=1).values('book') # 查询某一本书对应的作者有哪些(返回的内部是Author的对象的查询集) Author.objects.filter(book__id=1) Book.objects.filter(id=1).values('author')
“Django 怎么实现外键查询”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。