回顾上次学习DjangoORM的基本查询操作。查询操作主要使用filter()方法。我们知道filter()查询的是值,如果想得到第一个值,需要再次filter().first()。还要知道get()和filter().first()等的区别。DjangoORM还有很多疑问,继续看!!!查询操作对象。外键字段比如我们拿到一本书的信息,我们可以这样打印他的信息。代码book=models.Book.objects.filter(title="<<大明帝国>>").first()print(f"booktype:{type(book)}")print(f"id:{book.id}")print(f"书名:{book.title}")print(f"价格:{book.price}")print(f"书名:{book.PublishDate}")print(f"发布Publisher:{book.publish}")#外键字段执行结果注:蓝色为外键字段。不知道大家有没有疑问,为什么book.publish会打印出邮电出版社。造成这个的原因主要是外键对象的__str__方法。就是因为我的Publish返回的是self.title,所以我可以打印出邮电出版社。如果我想打印出版社的联系方式怎么办?代码print(f"Publishertype:{type(book.publish)}")##book.publish已经是一个models.Publish对象,所以可以随意调整print里面的属性(f"Publisherphone:{book.publish.phone},")执行结果汇总对象.foreignkeyfield获取外键字段对象,具体值可以直接通过object.foreignkeyfield.foreignkey获取属性。反向查询(表名__set.all())如上文所述,我们通过正向查询找到了图书对应的出版社的具体信息。但是如果我们得到一家出版社的名字呢?通常,您可能会这样做!代码#查询邮电出版社publish_obj=models.Publish.objects.filter(title="邮电出版社").first()#获取出版社idpublish_id=publish_obj.id#查询publish_id为的book_listpublishinghouseid=models.Book.objects.filter(publish_id=publish_id)print(book_list)执行结果其实还有一个方法:通过一个对象,反向查询多个对象。代码publish_obj=models.Publish.objects.filter(title="邮电出版社").first()book_list=publish_obj.book_set.all()print(book_list)执行双下划线跨表查询还是上面的问题,通过出版商名称,搜索属于该出版商的图书。基于双下划线的跨表查询,理论上更简单!注意:可以看到还有__contains等其他过滤条件查询,通过__的跨表查询还是可以通用的。代码book_list=models.Book.objects.filter(publish__title="邮电出版社")print(book_list)跨表连续的执行结果__不仅跨一张表,还跨多张表。以图书Manyauthors表为例,根据出版社查询图书和作者的多对多信息。代码ret=models.BookManyAuthor.objects.filter(book__publish__title="邮电出版社")打印(ret)跨book表和跨publish表执行结果值有时候,我们可能只需要一些特定的列,在这个时候使用值就可以了。代码#Syntaxbook_list=models.Book.objects.all().values("Column1","Column2",...)#Examplebook_list=models.Book.objects.all().values("title","price")print(book_list)codevalues返回的值有点像字典列表,但实际上还是QuerySet类型。values_listvalues_list和values的作用一样,都是取相关的列,只是返回的类型和格式不同。代码book_list=models.Book.objects.all().values_list("title","price")print(book_list)执行结果这个有点像元组列表,但实际上还是QuerySet。related_namerelated_name通常用于反向查询,代替<表名>_set。原始模式models.py代码#查询邮电出版社publish=models.Publish.objects.filter(title="邮电出版社").first()print(publish)#反向一对多book_list=publish.book_set.all()print(book_list)执行结果别名方法models.py代码#查询邮电出版社publish=models.Publish.objects.filter(title="邮电出版社").first()print(publish)#反向对多个book_list=publish.book_list.all()print(book_list)执行结果filter().filter()...上面我们说了它支持多个过滤器,filter()。filter()...这种情况一般用在过滤条件不确定,但是有多层过滤条件的情况下。代码#例子,下面的filter可以是其他或者条件book1=models.Book.objects.filter(title="<<大明帝国>>").filter(price="99")#效果同上book2=models.Book.objects.filter(title="<<大明帝国>>",price="99")print(book1)print(book2)执行结果总结本文主要是上一篇的续篇,或者关于过滤器部分的查询。这次主要是外键字段类型。反向查询默认使用<表名>__set,也可以使用related_name反向字段查询。双下划线可以用于条件查询、跨表查询、连续跨表。values和values_list的区别。用于条件过滤的多个过滤器。如果您在操作过程中有什么问题,记得在下方留言,我们看到会第一时间解决。微笑着告诉别人,今天的我比昨天好,以后也一样。本文转载自微信公众号《Python爬虫与数据挖掘》,可通过以下二维码关注。转载本文请联系Python爬虫与数据挖掘公众号。