Я столкнулся с чем-то неожиданным, и я уверен, что это должно быть простое решение.
Я пытаюсь использовать функцию CUME_DIST()
для аннотирования запроса django SQL. Эта часть работает нормально и дает мне правильный вывод.
Проблема, с которой я сталкиваюсь, заключается в том, что, когда я пытаюсь извлечь конкретный c элемент из аннотированного набора запросов, используя .get(user=request.user)
, он вернет меня назад. правильный пункт, но аннотированный столбец, кажется, переоценивается. Я хочу получить элемент с тем же аннотированным значением, что и в исходном запросе .
Обратите внимание, что я могу получить к нему правильный доступ с помощью индексной нотации (например: annotated_queryset[10]
дает правильный вывод для элемент с индексом 10), но я не уверен, с каким индексом будет выбран нужный элемент.
Пример моего кода:
annotated_queryset = Profile.objects.annotate(score_cume=RawSQL("""
CUME_DIST() OVER (
ORDER BY score
)
""", ()))
Выше приведен правильный набор запросов.
user_profile = annotated_queryset.get(user=request.user)
print("score cum : ", user_profile.score_cume)
Распечатка вышеупомянутого всегда дает 1.0, потому что (я полагаю) он оценивает score_cume
по отношению к одному объекту, который он извлекает.
Как я могу извлечь этот объект с помощью request.user
из исходный аннотированный набор запросов и сохранить аннотированное значение?
FWIW: я использую postgres с django