如何了解Django ORM操作
导读:本文共3713字符,通常情况下阅读需要12分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 查询操作对象.外键字段比如,我们拿到了一个书的信息,我们可以这样打印他的信息。代码book=models.Book.objects.filter(title="<<大明帝国>>").first()print(f"book类型:{type(book)}")print(f"id:{book.i... ...
目录
(为您整理了一些要点),点击可以直达。查询操作
对象.外键字段
比如,我们拿到了一个书的信息,我们可以这样打印他的信息。
代码
book=models.Book.objects.filter(title="<<大明帝国>>").first()print(f"book类型:{type(book)}")print(f"id:{book.id}")print(f"书名:{book.title}")print(f"价格:{book.price}")print(f"书名:{book.PublishDate}")print(f"出版社:{book.publish}")#外键字段
执行结果
注:蓝色为外键字段
不知道你有没有疑问,为什么book.publish会把邮电出版社打印出来。
这个原因主要在于外键对象的__str__方法。
就是因为我Publish返回的是self.title,所以才能打印出来邮电出版社,如果我想打印出版社联系方式咋办?
代码
print(f"出版社类型:{type(book.publish)}")#<class'web.models.Publish'>#book.publish已经是models.Publish对象,所以可以自由调里面的属性print(f"出版社电话:{book.publish.phone},")
执行结果
总结
对象.外键字段拿到的就是外键字段对象,直接就可以通过对象.外键字段.外键属性获取具体值。
反向查询(表名__set.all())
上述我们是通过正向查询的方式查询到了书对应的出版社具体信息。
但是如果说,我们拿到的就是一个出版社名呢?
通常情况下,你可能会这样!
代码
#查询邮电出版社publish_obj=models.Publish.objects.filter(title="邮电出版社").first()#获取出版社idpublish_id=publish_obj.id#查询publish_id为出版社id的book_list=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等其他filter条件查询,通过__跨表依然是可以通用的。
代码
book_list=models.Book.objects.filter(publish__title="邮电出版社")print(book_list)
执行结果
连续跨表
__不仅可以进行跨一张表,还能跨多张表。
以图书Many作者表为例,根据出版社查询图书和作者多对多的信息。
代码
ret=models.BookManyAuthor.objects.filter(book__publish__title="邮电出版社")print(ret)
跨了book表又跨了publish表
执行结果
values
有时候,我们可能只需要一些特定的列,这时候使用values即可。
代码
#语法book_list=models.Book.objects.all().values("列1","列2",...)#示例book_list=models.Book.objects.all().values("title","price")print(book_list)
代码
values返回的值有点像列表套字典,但是其实本质还是QuerySet类型。
values_list
values_list和values功能一样,都是取相关的列,但是返回的类型格式不一样。
代码
book_list=models.Book.objects.all().values_list("title","price")print(book_list)
执行结果
这个有点像列表套元组,但是其实本质还是QuerySet。
related_name
related_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(<条件>)...
这种情况通常用于不确定筛选条件,但是多层筛选的情况下。
代码
#举例而已,后面filter里面可以是其他或的条件book1=models.Book.objects.filter(title="<<大明帝国>>").filter(price="99")#效果同上book2=models.Book.objects.filter(title="<<大明帝国>>",price="99")print(book1)print(book2)
执行结果
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
如何了解Django ORM操作的详细内容,希望对您有所帮助,信息来源于网络。