I have 2 models connected with OneToOneField
:
class Person(TimeStampedModel, StatusModel):
name = models.CharField(max_length=300)
slug = models.SlugField(max_length=300)
class Card(TimeStampedModel, StatusModel):
title = models.CharField(max_length=300)
year = models.IntegerField()
comment = models.TextField(blank=True)
featured = models.BooleanField(default=False)
person = models.OneToOneField(Person, on_delete=models.CASCADE)
I want to query only name
and title
fields form Person
and Card
models.
I tried several approaches but none of them worked.
1st try
Person.objects.filter(slug=slug).only('name', 'card__title')
but generated query doesn't include card__title
:
SELECT "core_person"."id", "core_person"."name" FROM "core_person"
WHERE "core_person"."slug" = some-name
2nd try
Person.objects.filter(slug=slug).select_related('card').only('name')
but generated query includes all fields from Card
:
SELECT "core_person"."id", "core_person"."name", "core_card"."id",
"core_card"."title", "core_card"."year", "core_card"."comment",
"core_card"."featured"
FROM "core_person"
LEFT OUTER JOIN "core_card" ON ("core_person"."id" = "core_card"."person_id")
WHERE "core_person"."slug" = some-name
3rd try
Person.objects.filter(slug=slug).select_related('card').only('name', 'card__title')
but it throws weird exception:
django.core.exceptions.FieldError: Invalid field name(s) given in select_related: 'card'. Choices are: card
Desired result
Is there a way to receive a query like below not using .values()
?
SELECT "core_person"."id", "core_person"."name", "core_card"."id",
"core_card"."title"
FROM "core_person"
LEFT OUTER JOIN "core_card" ON ("core_person"."id" = "core_card"."person_id")
WHERE "core_person"."slug" = some-name