Использование информации о типе 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 для обработки ссылки на метку типа в классе.

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