Как подсчитать количество записей, пометить его и выбрать последнюю с помощью Django ORM

#django #python-3.x #django-orm

#django #python-3.x #django-orm

Вопрос:

Мне нужно выбрать записи, которые соответствуют определенному шаблону, посчитать их и выбрать последнюю. Как это сделать с помощью Django ORM?

Пробовал:

 Entry.objects.filter(A=B).annotate(Count("something")).latest("date")
  

Это учитывает только 1 элемент для каждого B. Если я удалю latest("date") , он подсчитывает правильно, но выдает только количество записей и ничего больше. Как правильно выполнить эту задачу?

UPD: Фактический код

 def render_entries(request):
    ids = Entry.objects.values("entry_token").distinct()
    entries = [Entry.objects.filter(entry_token=x["entry_token"]).annotate(count=Count("id")).latest("date_time") for x in ids]
    return render(request, "entries_list.html", {'entries':entries})
  

Комментарии:

1. Почему бы просто не разделить это на два предложения?

2. Звучит как два разных запроса

3. UPD: ваш код выглядит как образец анти-шаблонов.

4. @danihp Спасибо за ваше наблюдение, очень помогает!

5. Итак, что не работает, если вы делаете entries = [Entry.objects.filter(entry_token=x["entry_token"]).annotate(count=Count("id")).order_by("-date_time").first() for x in ids]

Ответ №1:

Обновлено, вероятно, не самое оптимальное, но это должно сработать.

 def render_entries(request):
    # get list of all entry_tokens with count
    tokens = Entry.objects.values('entry_token').annotate(count=Count('entry_token'))
    # create list of entries
    entries = []
    for token in tokens:
        entry = Entry.objects.filter(entry_token=token['entry_token']).latest('date_time')
        entry.count = token['count']
        entries.append(entry)
    return render(request, "entries_list.html", {'entries':entries})
  

Комментарии:

1. результат такой же, как указано в вопросе.

2. @wasd покажите нам ваш точный код. Он не может возвращать только количество записей.

3. Он возвращает не только количество записей — он учитывает только 1 элемент

4. @wasd Ах. Понятное изменение "something" на "id" . И это должно решить вашу проблему.

5. По какой-то причине никаких изменений вообще