拆分字典对象
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>
我正在构建一个博客应用程序,我制作了一个 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>