Создание пользовательского преобразования Django из аннотации

У меня есть аннотация для поля внешнего ключа, которую я часто использую, и я хотел бы написать пользовательское Django Transform, которое ведет себя аналогично этой аннотации. Аннотация, которая делает то, что я хочу, находится в этом фрагменте:

queryset = Event.objects.annotate(num_visits=Count("pageinfo__newpageview") + Sum(F("pageinfo__newpageview__timestamp_seconds__len")))

number_of_events_with_several_visits = queryset.filter(num_visits__gt=10).count()
number_of_events_with_many_visits = queryset.filter(num_visits__gt=100).count()
event_with_most_visits = queryset.order_by('-num_visits').first()

Я хотел бы превратить эту аннотацию в пользовательское преобразование, чтобы использовать ее в различных ситуациях без необходимости повторять аннотацию. Структура Transform будет выглядеть следующим образом:

class NumVisitsTransform(models.lookups.Transform):
    lookup_name = "num_visits"
    # Some implementation goes here

page_info_field = Events._meta.get_field("pageinfo").field
page_info_field.register_lookup(NumVisitsTransform)

Моя цель с этим преобразованием - дать возможность затем переписать приведенные выше примеры, не переформулируя аннотацию, чтобы она была:

number_of_events_with_several_visits = queryset.filter(pageinfo__num_visits__gt=10).count()
number_of_events_with_many_visits = queryset.filter(pageinfo__num_visits__gt=100).count()
event_with_most_visits = queryset.order_by('-pageinfo__num_visits').first()

Существует ли прямой способ написать реализацию Transform, используя аннотацию и выше, создавая ее из выражений в аннотации? Даже более простой пример построения Transform с использованием подвыражений был бы полезен.

Я пытался реализовать шаблон для SQL в Transform, но это быстро выходило за рамки моих возможностей в SQL. Я надеялся, что есть способ создать это без создания SQL, который мог бы справиться со всеми вариантами использования аннотации.

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