Как я могу фильтровать по полиморфному атрибуту для атрибута, существующего только в одном классе?
Я не знаю, как лучше сформулировать этот вопрос, поэтому позвольте мне показать пример:
Я использую 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}
Я только что попробовал это и это работает как шарм :-)