【问题标题】:How to recieve not all fields from related(ForeignKey) django model using 'select_related'如何使用'select_related'从相关(ForeignKey)django模型中接收并非所有字段
【发布时间】:2020-01-14 07:50:57
【问题描述】:

环境:

python >= 3.6
Django >=2.1.0

型号示例:

class A(models.Model):
    id = models.AutoField(primary_key=True)
    a_field = models.CharField(max_length=256, default="example")


class B(models.Model):
    id = models.AutoField(primary_key=True)
    b_field = models.CharField(max_length=256, default="example")
    a = models.ForeignKey(A, related_name="b", on_delete=models.CASCADE)

问题:

如何使用select_related()从相关模型中仅获取必填字段

如何使用prefetch_related

from django.db.models import Prefetch
prefetch_obj = Prefetch("a", queryset=A.objects.only("id", "a_field"))
B.objects.only("id", "b_field", "a").prefetch_related(prefetch_obj)

但由于 prefetch_related 使用,它产生了 2 个对 DB 的请求。

SELECT `main_b`.`id`, `main_b`.`b_field`, `main_b`.`a_id` FROM `main_b`  LIMIT 21; args=()
SELECT `main_a`.`id`, `main_a`.`a_field` FROM `main_a` WHERE `main_a`.`id` IN (1); args=(1,)

如果我使用 select_related,它会进行 1 次 DB 调用,但会从 A 模型中获取所有字段:

models.B.objects.only("id", "b_field", "a").select_related("a")

SELECT `main_b`.`id`, `main_b`.`b_field`, `main_b`.`a_id`, `main_a`.`id`, `main_a`.`a_field`, `main_a`.`a_not_required_field` FROM `main_b` INNER JOIN `main_a` ON (`main_b`.`a_id` = `main_a`.`id`)  LIMIT 21; args=()

【问题讨论】:

标签: python django django-models django-orm


【解决方案1】:

您可以使用.select_related('related_obj').only('related_obj__field')。请参阅Only 上的文档。

【讨论】:

    猜你喜欢
    • 2015-08-01
    • 1970-01-01
    • 2015-07-26
    • 2014-02-06
    • 2018-05-25
    • 2017-08-06
    • 2017-12-15
    • 2016-01-14
    • 2020-01-19
    相关资源
    最近更新 更多