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