如何使用'select_related'从相关(ForeignKey)django模型中接收并非所有字段
Posted
技术标签:
【中文标题】如何使用\'select_related\'从相关(ForeignKey)django模型中接收并非所有字段【英文标题】: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=()
【问题讨论】:
查看Selecting specific fields using select_related in Django 【参考方案1】:您可以使用.select_related('related_obj').only('related_obj__field')
。请参阅Only 上的文档。
【讨论】:
以上是关于如何使用'select_related'从相关(ForeignKey)django模型中接收并非所有字段的主要内容,如果未能解决你的问题,请参考以下文章
使用 select_related 将查询中的数据结果序列化为 json
迭代 Django 中的相关对象:循环查询集或使用单行 select_related(或 prefetch_related)
Django框架详细介绍---ORM相关操作---select_related和prefetch_related函数对 QuerySet 查询的优化