【问题标题】:Splitting dictionary objects拆分字典对象
【发布时间】:2021-11-17 18:13:05
【问题描述】:

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

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() 缺少 1 个必需的位置参数:“月”

试了很多次还是不行。

任何帮助将不胜感激。谢谢你

【问题讨论】:

    标签: python django django-views django-queryset


    【解决方案1】:

    您可以使用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>

    【讨论】:

      【解决方案2】:
      {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 %}
      

      【讨论】:

      • 我按照你说的做了,但它只显示date,就像24 in template loop
      • 我让模板更明确
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 2021-12-08
      相关资源
      最近更新 更多