【问题标题】:how to optimize the query here with select_related?如何使用 select_related 优化这里的查询?
【发布时间】:2020-08-02 18:46:36
【问题描述】:

我有

class A(models.Model):
    field_a = models.OneToOneField(B, on_delete=models.CASCADE)

class B(models.Model):
    field_b = models.charField()

如何在这里使用 select_related 或其他东西编写最优化的查询? 在我的用例中,我需要在代码中的某处同时使用模型 A 的 field_a 和模型 B 的 field_b。那么我可以在一个 db hit 中同时获取两个对象吗?

queryset_b = B.objects.get(field_b="some name")
queryset_a = A.objects.get(b=queryset_b).field_a
field_a_of_model = queryset_a
field_b_of_model = queryset_b.field_b
# then some manipulation with both fields

它两次命中数据库。我可以使用 select_related 在一个 db hit 中执行此操作,以便同时获取两个对象吗?

【问题讨论】:

    标签: django django-models django-queryset django-orm django-select-related


    【解决方案1】:

    你可以使用lookup that span relationship

    a = A.objects.get(b__field_b="some name")
    

    这将导致对数据库的单个查询


    如果您希望单个查询也可以访问 b 中的字段,请使用 select_related()

    a = A.objects.select_related().get(b__field_b="some name")
    a.field_a.field_b
    

    【讨论】:

    • 抱歉问题不完整。我也想访问模型 B 的字段。我已经更新了问题。
    • 如果在model B 我有另一个foreignkey field field_c 那么......我如何在这个查询中也获取该对象?因为现在如果我这样做a.field_a.field_c 将再次进行数据库查询。
    • 获取是什么意思
    • 通过 fetch 我的意思是只有一个查询可以在缓存中获取 field_c 的对象。就像我说的..a.field_a.field_c 不应该进行另一个数据库查询
    • select_related('field_b__field_c')
    猜你喜欢
    • 2017-05-25
    • 2017-02-20
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多