Python 在django查询中定义only()之后,是否仍然需要select_related()

Python 在django查询中定义only()之后,是否仍然需要select_related(),python,django,django-models,django-rest-framework,Python,Django,Django Models,Django Rest Framework,使用select_related,因此无论何时访问定义的外键,它都将包含在第一个查询中,并且不会向db发出另一个查询。但我有一个例子,当只需要几个字段时。这是一个例子 class PMapKomoditi(models.Model): id = models.IntegerField(primary_key=True) komoditi_fk = models.ForeignKey(PMastKomoditi, models.RESTRICT, db_column='id_kom

使用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_komoditi和komoditi_fk属性,因此我确实查询以下内容:

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

我是否需要包含与选择相关的内容,或者它已经包含在()中了?

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

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)

这将告诉你“在封面下”发生了什么事。

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

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)

这将告诉您“在封面下”发生了什么。

不会像
选择相关的
那样进行连接。因此,您不能仅用
替换
选择相关的
。此外,
select\u 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

不会像
选择相关
那样进行连接。因此,您不能仅用
替换
选择相关的
。此外,
select\u 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