Использование информации о типе django-polymorphic в выражениях запросов
У меня есть модель django с парой подтипов, которые до сих пор я обрабатывал явно. Каждая запись уникально идентифицируется тремя полями:
class Entity:
type = CharField(max_length=3)
released_at = DateTimeField()
number = IntegerField()
Я использую выражение запроса для объединения этого в одну строку для поиска и аннотирования результатов:
entity_uid_expr = Case(
When(
number=None,
then=Value(None),
),
default=Concat(
'type', ExtractYear('released_at'), 'number',
output_field=CharField()
),
output_field=CharField()
)
До сих пор это работало хорошо, но теперь два подтипа расходятся довольно сильно, и было бы проще обрабатывать их как подклассы, используя полиморфную модель. Я пытаюсь сделать примерно следующее:
class Entity:
released_at = DateTimeField()
number = IntegerField()
class EntityA(Entity):
type = 'A'
class EntityB(Entity):
type = 'B'
Но это удаляет информацию о типе из БД и нарушает выражение запроса.
Возможно ли установить значение поля по умолчанию на основе полиморфного класса? Единственная альтернатива, которую я могу придумать, это скрыть его от видимости и автоматически заполнять его нужным значением при сохранении.
Будет ли это жизнеспособным подходом или я что-то упускаю?
Спасибо!
Решение было довольно простым: Мне просто нужно было использовать данные полиморфного типа вместо моих собственных построенных вручную типов, что обеспечивает ту же уникальность/сортировку/фильтрацию, которая мне нужна.
entity_uid_expr = Case(
When(
number=None,
then=Value(None),
),
default=Concat(
'polymorphic_ctype_id', ExtractYear('released_at'), 'number',
output_field=CharField()
),
output_field=CharField()
)
Затем я удалил свое поле type
из модели и добавил метод pretty-print для обработки ссылки на метку типа в классе.