Выберите определенные поля после select_related() с помощью only()

У меня есть 2 модели, связанные с 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)

Я хочу запрашивать только поля name и title из моделей Person и Card.

Я пробовал несколько подходов, но ни один из них не работал.

Первая попытка

Person.objects.filter(slug=slug).only('name', 'card__title')

но сгенерированный запрос не включает card__title:

SELECT "core_person"."id", "core_person"."name" FROM "core_person" 
WHERE "core_person"."slug" = some-name

Вторая попытка

Person.objects.filter(slug=slug).select_related('card').only('name')

но сгенерированный запрос включает все поля из 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

3-я попытка

Person.objects.filter(slug=slug).select_related('card').only('name', 'card__title')

но выдает странное исключение:

django.core.exceptions.FieldError: Invalid field name(s) given in select_related: 'card'. Choices are: card

Желаемый результат

Есть ли способ получить запрос, как показано ниже, без использования .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

person VeGABAU    schedule 14.07.2016    source источник
comment
зачем вам это?   -  person knbk    schedule 14.07.2016
comment
В чем проблема с .values() ?   -  person Gocht    schedule 14.07.2016
comment
@Gocht Мне нужен экземпляр модели, а не дикт   -  person VeGABAU    schedule 14.07.2016
comment
@knbk, потому что на самом деле модель Card имеет ~ 10 больших полей, которые мне не нужны в этом запросе, и если я их извлеку, запрос замедлится   -  person VeGABAU    schedule 14.07.2016
comment
.only() работал на меня. Попробуйте получить только одного пользователя, я думаю, slug уникален: Person.objects.only('card__title').get(slug=slug)   -  person Gocht    schedule 14.07.2016
comment
@Gocht он выполняется, вы правы, но если я напишу person = Person.objects.only('card__title').get(slug=slug), а затем попытаюсь получить значение, подобное person.card.title, django выполнит второй запрос, чтобы фактически получить карту. Я хочу избежать второго запроса с select_related(). Но спасибо за ваше время и помощь.   -  person VeGABAU    schedule 14.07.2016
comment
Еще раз Person.objects.select_related('card').only('card__title').get(slug=slug) работает.   -  person Gocht    schedule 14.07.2016
comment
@Gocht странно, потому что я получаю исключение django.core.exceptions.FieldError: Invalid field name(s) given in select_related: 'card'. Choices are: card. Изменили ли вы что-нибудь в моделях и какую версию django вы используете?   -  person VeGABAU    schedule 14.07.2016
comment
Ну, я пытался с FK, вам не нужно выбирать, связанный с отношением 1 к 1 docs.djangoproject.com/es/1.9/topics/db/examples/one_to_one   -  person Gocht    schedule 14.07.2016
comment
@Gocht Хорошо, если я заменю OneToOneField на ForeignKey, я получу исключение AttributeError: 'ManyToOneRel' object has no attribute 'attname'. Не могли бы вы опубликовать код, который вы используете на pastebin? Извините, не понял, почему select_related не нужен для 1to1.   -  person VeGABAU    schedule 14.07.2016
comment
Это пример кода, который я тестирую с помощью pastebin.com/vpyUmhi7.   -  person Gocht    schedule 14.07.2016
comment
@Gocht в своем коде вы на самом деле делаете это наоборот. Вы звоните менеджеру по модели, у которой есть поле FK (в моем случае это Card, а не Person). В результате получается не Person экземпляр, а Card. Но в моем случае это все еще решает проблему. Большое спасибо за ваше время и помощь!   -  person VeGABAU    schedule 14.07.2016
comment
Добра тебе, здравствуй!   -  person Gocht    schedule 14.07.2016
comment
Отвечает ли это на ваш вопрос? Выбор определенных полей с помощью select_related в Django   -  person Qumber    schedule 25.11.2020