我試圖注釋另一個模型的總和,但按日期過濾。
我有機型Employee和Shift中,Shift一個有一個叫DecimalField dur,一個DateTimeField欄位start和外鍵的員工。
class Employee(models.Model):
name = models.CharField(max_length=64)
class Shift(models.Model):
employee = models.ForeignKey(Employee, on_delete=models.CASCADE)
start = models.DateTimeField()
dur = models.DecimalField(max_digits=4, decimal_places=2, default=0)
隨著Employee.objects.all().annotate(Sum('shift__dur'))我可以添加的總所有班次的,但我怎么能過濾這些變化,例如,在一個給定的日期范圍來總結剛剛轉變?
提前致謝!
uj5u.com熱心網友回復:
例如,您可以使用以下方式過濾:
Employee.objects.filter(
shift__start__range=('2022-01-01', '2022-01-31')
).annotate(
total=Sum('shift__dur')
)
這只會顯示2022 年 1 月的變化。此外Employee,2022 年 1 月沒有任何變化的 s將被過濾掉。
您還可以每周獲取資料,例如:
from django.db.models.functions import TruncWeek
Shift.objects.values(
'employee_id',
week=TruncWeek('start')
).annotate(
total=Sum('dur')
).order_by('employee_id', 'week')
這將構建一個QuerySet:
<QuerySet [
{'employee_id': 1, 'week': date(2022, 1, 3), 'total': Decimal('14.25')},
{'employee_id': 1, 'week': date(2022, 1, 10), 'total': Decimal('13.02')},
{'employee_id': 1, 'week': date(2022, 1, 17), 'total': Decimal('17.89')},
{'employee_id': 2, 'week': date(2022, 1, 3), 'total': Decimal('57.3')},
{'employee_id': 2, 'week': date(2022, 1, 17), 'total': Decimal('18.30')}
]>
因此,這使得每個員工主鍵和每周的聚合(一周被截斷以從星期一開始),并且總計列出了dur班次的總數。如果對于給定的employee_id-week組合,沒有班次,那么這將不會出現在查詢集中。因此,如果您想在這幾周內引入零,則需要進行一些后期處理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/420195.html
標籤:
