#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. По какой-то причине никаких изменений вообще