#python #django #annotations #aggregate
#python #django #аннотации #агрегировать
Вопрос:
У меня есть набор запросов activities, с которым связан идентификатор пользователя для этой модели. В этом примере у меня есть набор запросов, содержащий приведенное ниже на основе этого утверждения
activities.values('user_id').annotate(Min('duration'))
[
{'user_id': 149026, 'duration__min': Decimal('480.0000')},
{'user_id': 149026, 'duration__min': Decimal('454.0000')},
{'user_id': 149026, 'duration__min': Decimal('360.0000')},
{'user_id': 149027, 'duration__min': Decimal('420.0000')}
]
Мне нужно захватить активность для каждого идентификатора пользователя, который имеет наименьшую продолжительность. Я немного смущен тем, почему следующее утверждение ниже возвращает мне то, что я хочу
activities.values('user_id').annotate(Min('duration')).order_by('user_id')
[
{'user_id': 149026, 'duration__min': Decimal('360.0000')},
{'user_id': 149027, 'duration__min': Decimal('420.0000')}
]
Почему предложение order_by («user_id») возвращает мне активность с наименьшей продолжительностью для конкретного пользователя. Кроме того, не должно ли предложение value, предшествующее аннотации, приводить к тому, что возвращаемый запрос будет иметь один аннотированный результат для каждого уникального идентификатора пользователя?
Комментарии:
1. Вы можете проверить
.query
QuerySet
, чтобы вы могли понять, какой SQL-запрос автоматически генерируется каждый раз2. Именно этот случай описан в docs.djangoproject.com/en/3.1/topics/db/aggregation/… помогает ли это? Есть ли
activities
какой-либо порядок (возможно, вMeta
)?3. действия не имеют никакого порядка в meta. я просмотрю и свяжусь с q