Преобразование диктанта в различные объекты

Я создаю приложение для блога и я сделал queryset, который является showing blog date and likes каждого дня с blog date, Но он отображается в dictionary, и я пытаюсь показать оба случая по-разному в таблице, например

Blog Date Likes
20 Sep. 6 Likes
21 Sep. 2 Likes
22 Sep. 4 Likes

Но он отображается как :-

({20: 6},{21: 2},{22: 4})

views.py

from django.db.models.functions import ExtractDay
from collections import Counter

def page(request):
    blogpost = get_object_or_404(BlogPost,pk=pk)

    totals = blogpost.likes_set.filter(
        blogpost__date=blogpost.date,
        ).annotate(
            date=ExtractDay('blogpost__date'),
        ).values(
            'date'
        ).annotate(
            n=Count('pk')
        ).order_by('date').values()

    results = Counter({d['date']: d['n'] for d in totals})

    context = {'results':results}
    return render(request, 'page.html', context)

Что я пробовал? :-

  • Я пробовал
lists = [{'id': blog.date, 'name': blog.n} for blog in results ]

Но он показывает только дату 24, а не лайки

  • чем я пытался
json.dumps(list(results ))
  • чем я пытался
from calendar import monthrange

__, ds = monthrange(blogpost.date)
finalSecond = [data[i] for i in range(1, ds+1)]

Но он показал

monthrange() missing 1 required positional argument: 'month'

Я пробовал много раз, но он все еще не работает.

Любая помощь будет очень признательна. Спасибо

{d['date']: d['n'] for d in totals}

Создает dict, ключами которого являются даты, а vals - значения. Хотя данные из него можно извлечь, это не имеет никакого смысла, особенно если хранить их в списке. Но у вас уже есть хорошо структурированный вывод в итоговых значениях, поэтому используйте его напрямую, не оборачивая все это в Counter диктов (кстати, я понятия не имею, зачем вы используете Counter).

return render(request, 'page.html', {"results": totals})

Таким образом, ваши данные хорошо проникают в шаблон. Затем ваш html-шаблон должен просто итерировать результаты:

{% for result in results %}
<tr>
  <td>result.date</td><td>result.n</td>
</tr>
{% endfor %}

Вы можете использовать TruncDate для получения даты:

from django.db.models import Count
from django.db.models.functions import TruncDate

totals = blogpost.likes_set.filter(
    blogpost__date=blogpost.date,
).values(
    date=TruncDate('blogpost__date')
).annotate(
    n=Count('pk')
).order_by('date')

Если вы передадите это в контекст, вы можете отобразить его с помощью:

<table>
  <thead>
    <th>Blog Date</th><th>Likes</th>
  </thead>
  <tbody>
    {% for item in totals %}
      <tr>
        <td>{{ item.date|date:"F, d" }}</td><td>{{ item.n }}</td>
      </tr>
    {% endfor %}
  </tbody>
</table>
Вернуться на верх