【问题标题】:Is select_related() still needed after defining only() in django query在 django 查询中定义 only() 后是否仍需要 select_related()
【发布时间】:2021-05-16 10:36:47
【问题描述】:

select_related 被使用,因此每当访问定义的外键时,它将包含在第一个查询中,并且不会向 db 发出另一个查询。但我有一个案例,只需要几个字段。这是一个例子

class PMapKomoditi(models.Model):
    id = models.IntegerField(primary_key=True)
    komoditi_fk = models.ForeignKey(PMastKomoditi, models.RESTRICT, db_column='id_komoditi')
    kd_komoditi = models.CharField(max_length=2)
    nm_komoditi = models.CharField(max_length=50, blank=True, null=True)
    uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
    // ...


class PMastKomoditi(models.Model):
    id = models.AutoField(primary_key=True)
    uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
    // ...

我只需要 kd_komoditikomoditi_fk 属性,所以我会查询以下内容:

my_query = PMapKomoditi.objects.select_related(
    'komoditi_fk'
).Only(
    'kd_komoditi',
    'komoditi_fk'
)

我是否需要包含 select_related 或者它已经被 only() 覆盖了?

【问题讨论】:

    标签: python django django-models django-rest-framework


    【解决方案1】:

    好问题!而且我不知道答案!但是您可以通过使用查询集的“查询”属性来查找。

    my_query = PMapKomoditi.objects.select_related('komoditi_fk').only('kd_komoditi','komoditi_fk')
    print(my_query.query)
    
    test_query = PMapKomoditi.objects.only('kd_komoditi','komoditi_fk')
    print(test_query.query)
    

    这会告诉你“幕后”发生了什么。

    【讨论】:

      【解决方案2】:

      不,only 不会像 select_related 那样进行连接。所以你不能用only替换select_related。此外,select_related 引用的字段也必须是对only 的调用的一部分,如果您正在使用它并且不能延迟。如果您只想选择几个相关模型字段,也可以将相关字段添加到 only 调用中。

      如有疑问,应进一步检查 ORM 生成的 SQL 查询:

      my_query = PMapKomoditi.objects.select_related(
          'komoditi_fk'
      ).only(
          'kd_komoditi',
          'komoditi_fk'
      )
      
      print(my_query.query) # Performs an INNER JOIN
      
      
      my_query2 = PMapKomoditi.objects.only(
          'kd_komoditi',
          'komoditi_fk'
      )
      
      print(my_query2.query) # No INNER JOIN
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-16
        • 2017-05-25
        • 1970-01-01
        • 2019-04-23
        • 2013-06-04
        • 2013-11-28
        • 2021-01-28
        • 1970-01-01
        相关资源
        最近更新 更多