Вопрос об агрегации Django — странное поведение

#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