python - 如何使用'select_related'从相关(ForeignKey)django模型中接收并非所有字段
问题描述
环境:
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=()
解决方案
您可以使用.select_related('related_obj').only('related_obj__field')
. 请参阅Only上的文档。
推荐阅读
- c - 在 C 中以浮点数据类型打印超过 6 个十进制数字时打印的随机数字(GCC 编译器)
- php - 产品售罄时更改“添加到购物车”文本
- leaflet - Leaflet 和 mapbox 交通矢量集成显示黑色地图
- python - Python:urllib urlopen 卡住,超时错误
- hadoop - 如何将共享 id 的多行合并为一行(HQL)?
- c++ - vcpkg "系统找不到指定的路径"
- c# - 将零和一的矩阵保存为位序列
- ubuntu - Ubuntu:内核 5.6.0-rc3:file_operations 中不支持 IOCTL?
- python - 更新:网格项目
- java - Java 无法识别 Windows 隐藏目录