其他分享
首页 > 其他分享> > 八、Django的orm之多表操作(二)

八、Django的orm之多表操作(二)

作者:互联网

一、查询(重点)

  1. 基于对象的跨表查询 -- 类似于子查询

正向查询和反向查询

关系属性(字段)写在哪个表里面,从当前类(表)的数据去查询它关联类(表)的数据叫做正向查询,反之叫做反向查询

  1. 基于双下划线的跨表查询 -- 类似连表join

正向查询和反向查询

3.related_name

反向查询时,如果定义了related_name ,则用related_name替换 表名,

注意:,用在外键的创建 ForeignKey 中的一个参数,只会影响反向查询

例如:

# 在创建Book表的时候

class Book(models.Model):
    ......
    publish=models.ForeignKey(to="Publish", to_field = "nid", on_delete = models.CASCADE,related_name='xx')
    ......
    
# 因为定义了related_name='xx',所以
    # 在正向查询时,不会影响什么
    # 在反向查询时,就不会用小写的表名了,而是必须用'xx',否则会报错
    
比如查询 装13是如何炼成的 这本书的出版社的名字
正向查询:
    obj = models.Book.objects.filter(title='装13是如何炼成的').values('publish__name')
    print(obj)
反向查询:
    # 没加related_name='xx'
    obj1 = models.Publish.objects.filter(book__title='装13是如何炼成的').values('name')
    print(obj1)
    # 加入了related_name='xx'
    obj1 = models.Publish.objects.filter(xx__title='装13是如何炼成的').values('name')
    print(obj1)

二、聚合查询

  1. 聚合

计算所有图书的平均价格、最高价格

from django.db.models import Avg,Max,Min,Count
obj = models.Book.objects.all().aggregate(a=Avg('price'),m=Max('price'))
print(obj)  # {'a': 411.998571, 'm': Decimal('998.00')}

注意点:

标签:__,obj,name,models,Django,orm,之多表,查询,book
来源: https://www.cnblogs.com/yangzm/p/11241117.html