Reputation: 504
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)
How I can fetch only required fields from related models using select_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.
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:
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=()
Upvotes: 0
Views: 464