简体   繁体   English

如何使用'select_related'接收来自related(ForeignKey)Django模型的所有字段

[英]How to recieve not all fields from related(ForeignKey) django model using 'select_related'

Env: ENV:

python >= 3.6 python> = 3.6
Django >=2.1.0 的Django> = 2.1.0

Models example: 型号示例:

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)

Question: 题:

How I can fetch only required fields from related models using select_related() 如何使用select_related()从相关模型中仅获取必填字段

How it could be done with prefetch_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)

But it produces 2 request to DB due to prefetch_related using. 但是由于prefetch_related使用,它向DB产生2个请求。

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,)

If I use select_related it makes 1 DB call, but fetches all fields from A model: 如果我使用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=()

You can use .select_related('related_obj').only('related_obj__field') . 您可以使用.select_related('related_obj').only('related_obj__field') Please see the docs on Only . 请参阅Only上的文档。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM