【问题标题】:Django group and sum QuerySet for template模板的 Django 组和求和 QuerySet
【发布时间】:2021-02-15 13:07:48
【问题描述】:

希望有人可以提供帮助!如果问题写得不好,请见谅,这是我的第一篇文章。

我正在尝试将查询集传递给模板 - 如果我不通过时间表 pk(在下面的示例输出中为 pk)我会收到错误,但我不想这样做,因为它会干扰组:

    pk  staff_number week_number week_start  hours contractor_id
    1   12345        31          2020-10-24  15    1
    2   12345        30          2020-10-17  7.5   1
    4   12345        30          2020-10-17  10.0  1

基本上,我希望输出分组以仅显示两行(2020-10-17 应该是一行,总共 17.5 小时)。

我的模型是:

   from django.db import models
   from django.contrib.auth.models import User


    class Contractor(models.Model):
        user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
        staff_number = models.CharField(max_length=9, null=True)
        contractor_name = models.CharField(max_length=100, null=True)
        date_created = models.DateTimeField(auto_now_add=True, null=True)

        objects = models.Manager()

        def __str__(self):
            return f"{self.staff_number}: {self.contractor_name}"


    class WeekList(models.Model):
        week_number = models.SmallIntegerField(null=True)
        week_start = models.DateField(null=True)

        objects = models.Manager()

        def __str__(self):
        return f"{self.week_number}: ({self.week_start})"


    class Timesheet(models.Model):
        user = models.ForeignKey(User, null=True, on_delete=models.PROTECT)
        contractor = models.ForeignKey(to='timesheet.Contractor', null=True, on_delete=models.PROTECT)
        week_list = models.ForeignKey(to='timesheet.WeekList', null=True, on_delete=models.PROTECT)
        job_number = models.CharField(max_length=16, null=True)
        sat_hours = models.FloatField(default=0, null=True, blank=True)
        sun_hours = models.FloatField(default=0, null=True, blank=True)
        mon_hours = models.FloatField(default=0, null=True, blank=True)
        tue_hours = models.FloatField(default=0, null=True, blank=True)
        wed_hours = models.FloatField(default=0, null=True, blank=True)
        thu_hours = models.FloatField(default=0, null=True, blank=True)
        fri_hours = models.FloatField(default=0, null=True, blank=True)
        timesheet_revision = models.SmallIntegerField(null=True)
        date_created = models.DateTimeField(auto_now_add=True, null=True)

        objects = models.Manager()

        def __str__(self):
            return f"{self.contractor} {self.week_list.week_start} {self.timesheet_revision}"

这是我正在努力解决的 views.py 的 sn-p:

query = Timesheet.objects.filter(user=user_id).values('pk','contractor__staff_number', 'week_list__week_number', 'week_list__week_start').query

query.group_by = ['contractor__staff_number', 'week_list__week_number', 'week_list__week_start']

timesheets = QuerySet(query=query)

total_timesheets = timesheets.count()

print(total_timesheets)

for timesheet in timesheets:
    print(f"{timesheet.pk} {timesheet.contractor.staff_number} {timesheet.week_list.week_start} {timesheet.contractor.pk}")

total_timesheets = timesheets.count()

print(total_timesheets)   

谁能给出一些建议如何按周开始对数据进行分组并按小时求和(我已经使用注释进行了总和,但在我正确分组之前将其取出)?

另外,谁能告诉我为什么第一个 print(total_timesheets) 显示 2 而第二个显示 3??

2  << 1st total_timesheets
1 12345 2020-10-24 1
2 12345 2020-10-17 1
4 12345 2020-10-17 1
3  << 2nd total_timesheets!

希望你能拯救我的理智!

更新:我有一个 QuerySet,它使用这个方法返回分组数据(确保它不是“最佳实践”的方式,但它有效):

query = Contractor.objects.filter(user=user_id).values('pk', 'staff_number', 'timesheet__week_list__week_number').annotate(
    count_timesheets=Count('timesheet__week_list', distinct=True)).query

我可以通过这种方式从 QuerySet 中获取数据:

for contractor in contractors:
    print({'id': contractor.id, 'name': contractor.contractor_name, 'week_start': contractor.timesheet_set.values('week_list__week_start'), 'count': contractor.count_timesheets})

如何在模板中引用 week_start 字段(上面的引用方法当然行不通)?

【问题讨论】:

    标签: django django-views


    【解决方案1】:
    Timesheet.objects.filter(user=user_id).values('week_list ').annotate(hour=Sum('hours'))
    

    试试这个查询

    【讨论】:

    • 感谢您的建议。虽然没有工作。除非我将 pk 放在 values 列表中,否则我会在网页中不断收到 'NoneType' object has no attribute 'attname' 错误,并在命令窗口中收到 TypeError: 'Timesheet' object is not subscriptableKeyError: 'week_list' 错误。
    • 如果你把 pk 你会得到所有行因为 pk 是唯一的
    猜你喜欢
    • 2015-02-19
    • 2015-04-18
    • 2011-01-26
    • 2016-11-19
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    相关资源
    最近更新 更多