【发布时间】: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