拆分字典对象

Splitting dictionary objects

我正在构建一个博客应用程序,我制作了一个 queryset,自 blog date 以来每天 showing blog date and likes,但它显示在 dictionary 中,我是试图在 table 中以不同方式显示这两个实例。

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

但它显示为:-

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

models.py

class BlogPost(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=30, default='')
    date = models.DateTimeField(auto_now_add=True)

class Likes(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    blogpost_like = models.ForeignKey(BlogPost, on_delete=models.CASCADE)

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_like__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}

创建一个以日期为键,以值为值的字典。虽然可以从中提取数据,但它没有任何意义,尤其是当您将它们存储在列表中时。但是你的总计中已经有了结构良好的输出,所以直接使用它而不用将它全部包装在一个 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(
    <strong>date=TruncDate('blogpost__date')</strong>
).annotate(
    n=Count('pk')
).order_by('date')

如果将其传递给上下文,则可以使用以下方式呈现它:

<table>
  <thead>
    <th>Blog Date</th><th>Likes</th>
  </thead>
  <tbody>
    {% for item in totals %}
      <tr>
        <td>{{ <strong>item.date|date:"F, d"</strong> }}</td><td>{{ item.n }}</td>
      </tr>
    {% endfor %}
  </tbody>
</table>