我正在开展一个为期两周的项目。我有一个带有
start_date
和 end_date
的模型,如下所示:
class CreateNewTimesheet(models.Model):
employee = models.ForeignKey(Employee, on_delete=models.CASCADE)
start_date = models.DateField(_("Start Date"))
end_date = models.DateField(_("End Date"))
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
我希望能够添加另一行或将
start_date
和 end_date
分组的内容。
Dates: 03/06/2024 - 03/16/2024
And group or tie that to "week 1".
其背后的目的是根据两周的时间段创建一个时间表。我需要能够按两周时间段对时间表进行分组,并将它们与该特定组联系起来。所有时间表都需要存储。
输入
start_date
和 end_date
后,我需要将它们与第一周联系起来。我正在考虑在 CreateNew
模型中添加另一行,然后将其与第一周联系起来。然后输入每个start_date
和end_date
,为每个新的start_date
输入一个新的“周”,并创建end_date
。这应该基于 created_at
条目吗?每周是否应该按新网址进行分组?
老实说,我现在对按两周分组然后绑定到新的一周感到困惑。
尝试创建一个新模型
TwoWeekPeriod
来表示两周的时间段。
week_number 是根据开始日期计算的,新的
TwoWeekPeriod
是根据开始和结束日期创建或检索的。
from django.db import models
from django.utils import timezone
class TwoWeekPeriod(models.Model):
start_date = models.DateField(_("Start Date"))
end_date = models.DateField(_("End Date"))
week_number = models.IntegerField(_("Week Number"))
class CreateNewTimesheet(models.Model):
employee = models.ForeignKey(Employee, on_delete=models.CASCADE)
start_date = models.DateField(_("Start Date"))
end_date = models.DateField(_("End Date"))
two_week_period = models.ForeignKey(TwoWeekPeriod, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def save(self, *args, **kwargs):
week_number = (self.start_date - timezone.now().date()).days // 14 + 1
two_week_period, _ = TwoWeekPeriod.objects.get_or_create(
start_date=self.start_date,
end_date=self.end_date,
defaults={'week_number': week_number}
)
self.two_week_period = two_week_period
super().save(*args, **kwargs)
回答评论里的问题
按照上述答案定义
TwoWeekPeriod
模型和 CreateNewTimesheet
模型后,获取第 1 周的 TwoWeekPeriod
对象,然后
与第 1 周 TwoWeekPeriod
相关的时间表
week_1_period = TwoWeekPeriod.objects.get(week_number=1)
timesheets_week_1 = CreateNewTimesheet.objects.filter(two_week_period=week_1_period )
so
timesheets_week_1
包含属于第 1 周的所有时间表