Как я могу фильтровать по полиморфному атрибуту для атрибута, существующего только в одном классе?

Я не знаю, как лучше сформулировать этот вопрос, поэтому позвольте мне показать пример:

Я использую Django-polymorphic и имею такую структуру:

from polymorphic.models import PolymorphicModel
from django.db import models


class Book(PolymorphicModel):
    author = models.OneToOneField(
        "Author",
        on_delete=models.PROTECT,
        null=True,
        blank=True,
    )

class Author(models.Model):
    name = models.CharField(max_length=20, blank=True)

class AnonymousAuthor(Author):
    known_as = models.CharField(max_length=20, blank=True)

Я хочу отфильтровать все книги анонимного автора, известного как "foobar".

Я пытался:

Book.objects.filter(author__known_as="foobar").all()

но я получаю:

Не удается преобразовать ключевое слово 'known_as' в поле. Варианты: имя.

Я могу отфильтровать книги анонимных авторов следующим образом:

aa_ctype = ContentType.objects.get_for_model(AnonymousAuthor) Book.objects.filter(author__polymorphic_ctype=aa_ctype)

Но даже с этим я не могу отфильтровать книги с таким названием.

Как я могу отфильтровать все книги анонимного автора "foobar"?

Необходимо сделать фильтрацию с помощью Django ORM. В моем реальном примере мне нужно сделать это для django-filters.

Думаю, проблема в том, что ваша PolymorphicModel не Book, а Author.

Со:

class Book(models.Model):
    .....

class Author(PolymorphicModel):
    ....

class AnonymousAuthor(Author):
    ....

Я нашел его:

Book.objects.filter(author__anonymousauthor__known_as="foobar").all()

Итак, шаблон:

{attribute}__{classname in lowercase}__{attribute}

Я только что попробовал это и это работает как шарм :-)

Вернуться на верх