Django.db.utils.NotSupportedError: Окно запрещено в фильтре

Существует модель:

class UserToOrgunit(models.Model):
    store_id = models.PositiveIntegerField()
    role = models.CharField(max_length=5)

role могут быть SD, DSD, AMD. Каждый role имеет приоритет: SD имеет наивысший приоритет, а ADM - наименьший.

Для каждого store_id мне нужно получить UserToOrgunit экземпляр с самым высоким role.

Данные выборки:

store_id | role
----------------
1        | SD
1        | ADM
2        | DSD
3        | DSD
3        | SD

Ожидаемый выход:

store_id | role
----------------
1        | SD
2        | DSD
3        | SD

Я попробовал следующее:

from django.db.models import Case, When, Value, Window, F, IntegerField
from django.db.models.functions import RowNumber

priority = Case(
    When(role='SD', then=Value(0)),
    When(role='DSD', then=Value(1)),
    When(role='ADM', then=Value(2)),
    output_field=IntegerField()
)

row_number = Window(
    expression=RowNumber(),
    partition_by=[F('store_id')],
    order_by=F('priority').asc()
)

UserToOrgunit.objects.annotate(priority=priority, row_number=row_number).filter(row_number=1)

Но при этом возникает ошибка:

django.db.utils.NotSupportedError: Окно запрещено в фильтре clause.

Как с этим справиться? Или, может быть, с этим можно справиться без RowNumber? Если да, то как?

Вы также можете сделать это с помощью необработанного запроса следующим образом:

query = """
      SELECT id, store_id, role, CASE WHEN role = 'SD' THEN 3 
      WHEN role = 'DSD' THEN 2 ELSE 1 END p FROM your_app_usertoorgunit
      GROUP BY store_id HAVING MAX(p);
"""
objs = UserToOrgunit.objects.raw(query)
for obj in objs:
  # do something with obj
Вернуться на верх