zoukankan      html  css  js  c++  java
  • Django的跨表查询单下划线_和双下划线__的区别

    一、下划线__和点的区别

    1. 存在两个表:

    biao1:
    字段:name = test1
    字段:data = data1

    biao2:
    字段:name = test2
    字段:data = data2
    外键:b1 = 外键( biao1 ) # 此时数据为biao1中的(test1的整个数据)

    1. 查询表内字段(点):直接查询biao1数据,A = biao1.object.all()[0] , A.name即可查询出来,
    2. 跨表查询数据时(__):
      当只传入一个test1数据,需要查询biao2中的与biao1的name有关联的数据时:
      B = biao2.object.filter(b1__name=‘test1’)
      此时查询出来的B就是包含test2的整个数据的QuerySet对象

    二、那么一个下划线_又是怎么回事呢?

    1. 当我们对biao2进行跨表查询的时候:C= biao2.object.all()[0] , 此时我们跨表查询的时候:
      C.b1 这时候我们得到的是biao1的一个对象,通过查询:
      C.b1.id # 得到结果为 1 (这个1是假设的)
      C.b1.name # 得到结果为 test2
      C.b1.data # 得到结果为 data2

    2. 我们还可以通过这样来查询,一个下划线_:
      C.b1_id # 得到结果为 1 (和前面的C.b1.id得到的结果是一样的)
      这是为什么呢?因为我们生成biao2外键的时候就是直接生成了b1_id这一列在表里了,所以当我们使用一个下划线(C.b1_id)的时候,其实是对表内进行查询,并没有进行跨表查询,而(C.b1.id)是进行了跨表查询

    三、那么一个下划线_和双下划线__又是什么情况呢?

    1. 当我们跨表查询数据时:
      当只传入一个id=1的数据时,需要查询biao2中的与biao1的有关联的数据时:
      B = biao2.object.filter(b1_id=1) #不跨表
      B = biao2.object.filter(b1__id=1) # 跨表
    2. 还有一种是多表关联查询时:
      当只传入一个biao3数据中的id=1的数据时,biao1中对biao3的外键是b3,需要查询biao2中的与biao1中的biao3的有关联的数据时,会出现这种情况
      B = biao2.object.filter(b1__b3_id=1) # 即表示只跨了一个表,查询到了biao1表中的b3_id这一列数据了

    尽量写的通俗易懂了,提供了下思路,看不明白的话,自行搜索‘神奇的双下划线和点’就行了

  • 相关阅读:
    Android网页打开指定App
    使用Android Studio Gradle实现友盟多渠道打包
    Android开发 PopupWindow弹窗调用第三方地图(百度,高德)实现导航功能
    Android使用Mob ShareSDK 分享不同平台
    Android布局优化之层级优化
    (Facebook开源项目)Fresco:一个新的Android图像处理类库
    关于Android开发的几点建议
    [AndroidTips]startService与bindService的区别
    基于HBase的手机数据备份系统 .
    MySQL在CenterOS和Ubuntu的安装
  • 原文地址:https://www.cnblogs.com/hjjjjh/p/13251472.html
Copyright © 2011-2022 走看看