django ORM разный вывод одного QuerySet для шаблона и shell
Прошу помощи:
QuerySet запрос один, но в оболочке shell выдает нужный результат, а в шаблоне нет
Имеется таблица в базе данных
date book news
2021-11-29 11:35:00 15 15
2021-11-28 09:35:00 14 18
2021-11-28 10:35:00 11 20
2021-11-29 09:35:00 11 15
2021-11-29 10:35:00 16 11
2021-11-28 11:35:00 10 12
Поле date - CharField
Необходимо чтобы была группировка по дате без времени, т.е 2021-11-28 и максимальное число по столбцу book и news за это число В итоге чтобы в шаблон отправлялся QuerySet:
[{'date': '2021-11-28', 'max_book': '14', 'max_news': '20'},
{'date': '2021-11-29', 'max_book': '16', 'max_news': '15'}]
Имею класс
class test(ListView):
model = UseTest
template_name = 'test/use_test.html'
context_object_name = 'usetest'
result = (UseTest.objects
.annotate(newdate=Left('datemaxagent', 10), max_book=Max('book'), max_news=Max('news'))
.values('newdate', 'max_book', 'max_news')
.annotate(totals=(F('max_book') + F('max_news')))
)
def get_context_data(self, *, object_list=None, **kwargs):
context = super(test, self).get_context_data(**kwargs)
context['title'] = 'Тестовая страница'
return context
def get_queryset(self):
return self.result
В оболочке shell выводит QuerySet, который нужен:
>>> result = (UseTest.objects
... .annotate(newdate=Left('datemaxagent', 10), max_book=Max('book'), max_news=Max('news'))
... .values('newdate', 'max_book', 'max_news')
... .annotate(totals=(F('max_book') + F('max_news')))
... )
>>> print(result)
<QuerySet [{'newdate': '2021-11-28', 'max_book': 14, 'max_news': 20, 'totals': 34}, {'newdate': '2021-11-29', 'max_book': 16, 'max_news': 15, 'totals': 30}]>
>>>
Через shell в итоге видим
<QuerySet
[{'newdate': '2021-11-28', 'max_book': 14, 'max_news': 20, 'totals': 34},
{'newdate': '2021-11-29', 'max_book': 16, 'max_news': 15, 'totals': 30}]
>
А на сайте QuerySet {{ usetest }} имеет другой значение, он выводит все. (примечание: на всякий случай почему тут не result или object_list, а usetest -> context_object_name = 'usetest')
<QuerySet
[{'newdate': '2021-11-28', 'max_book': 10, 'max_news': 12, 'totals': 22},
{'newdate': '2021-11-28', 'max_book': 11, 'max_news': 20, 'totals': 31},
{'newdate': '2021-11-28', 'max_book': 14, 'max_news': 18, 'totals': 32},
{'newdate': '2021-11-29', 'max_book': 11, 'max_news': 15, 'totals': 26},
{'newdate': '2021-11-29', 'max_book': 16, 'max_news': 11, 'totals': 27},
{'newdate': '2021-11-29', 'max_book': 15, 'max_news': 15, 'totals': 30}]
>
Запрос result один и тот же, но в оболочке shell и в шаблоне результаты разные.
Так же странно работает paginate_by не важно с каким значением, например paginate_by = 10, то почему то QuerySet в шаблоне обрезается до 2х записей,
причем берет первые записи из QuerySet, который содержит все записи (см выше), а кол-во 2 потому что при group by выводилось именно 2 строки.
<QuerySet
[{'newdate': '2021-11-28', 'max_ccloud': 10, 'max_ccs3': 12, 'totals': 22},
{'newdate': '2021-11-28', 'max_ccloud': 11, 'max_ccs3': 20, 'totals': 31}]
>
Попробовал через функцию:
def TestUse(request):
result = UseTest.objects.all()
paginator = Paginator(result, 4)
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
return render(request, 'test/use_test.html', {'page_obj': page_obj})
Меняю запрос в result
def TestUse(request):
result = (UseTest.objects
.annotate(newdate=Left('datemaxagent', 10), max_book=Max('book'), max_news=Max('news'))
.values('newdate', 'max_book', 'max_news')
.annotate(totals=(F('max_book') + F('max_news')))
)
paginator = Paginator(result, 4)
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
return render(request, 'test/use_test.html', {'page_obj': page_obj})
Выводит две первые строки, т.е так же как и через класс и так же странно работает pagination. Просьба помочь разобраться как получить в шаблоне QuerySet, такой же как и в оболочке Shell. В Shell отображается верный.
Ответы (1 шт):
Насторожила некорректная работа pagination. Суть в том, что не работала сортировка и он выдавал первые две записи QuerySet. Добавил order_by('newdate') и получил нужный результат
result = (UseTest.objects
.annotate(newdate=Left('datemaxagent', 10), max_book=Max('book'), max_news=Max('news'))
.values('newdate', 'max_book', 'max_news')
.annotate(totals=(F('max_book') + F('max_news')))
.order_by('newdate')
)