Как мне перечислить 10 последних представлений с разными идентификаторами пользователей в django? - PullRequest
2 голосов
/ 18 февраля 2010

Я хочу создать список из 10 последних заявок, но от разных пользователей.

Что я сейчас делаю, так это:

unique_users = []
submissions_from_different_users = []
submissions = Submission.objects.all().order_by('-date')

for submission in submissions:
    if len( submissions_from_different_users ) == 10:
        break
    if not submission.user in unique_users:
        submissions_from_different_users.append( submission )
        unique_users.append( submission.user )
return submissions_from_different_users

Должен быть лучший способ сделать это - но как?

Ответы [ 2 ]

3 голосов
/ 18 февраля 2010

Есть несколько подходов.

  • Если отправка не происходит слишком часто, но вы хотите отображать этот список очень часто, вы можете денормализовать таблицы, сохранив дату последней отправки в пользовательской таблице. Тогда это просто User.objects.all().order_by('-last_submission_date')[:10]. Если вы используете django.contrib.auth.models.User, сделать это будет нелегко.
  • Если вы хотите создать его на лету, это не так просто. Django может упорядочивать по столбцам из других таблиц, например, User.objects.all().order_by('-submission__date'), но вы не получите отчетливых результатов из-за объединения.

Для второго подхода лучший запрос, который я могу придумать сейчас:

User.objects.annotate(last_submission=models.Max('submission__date')).order_by('-last_submission')[:10]

Это, вероятно, не более эффективно, чем ваш подход, особенно если у вас много пользователей, но полезно, если вам нужно только получать этот список время от времени.

0 голосов
/ 18 февраля 2010

Уилл на правильном пути. Я предполагаю, что заявки с более высоким идентификатором были отправлены позже, чем заявки с меньшим идентификатором:

  users = User.objects.annotate(last_submission_id = models.Max('submission__id')).\
     order_by('-last_submission_id')[:10]

  submissions = Submissions.objects.\
                    filter(id__in = [user.last_submission_id for user in users])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...