对模型按两周分组并与数据录入关联的最佳方法?
我正在做一个项目,这个项目是基于两周的时间段。我有一个模型,其中有一个 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
时,就为每一对新的日期创建一个新的“周”。这个新的“周”应该基于 created_at
的输入吗?每周是否应该通过一个新的网址来分组?
老实说,我现在在如何按两周分组以及如何关联到新周这两方面都卡住了。
1 个回答
0
试着创建一个新的模型 TwoWeekPeriod
,用来表示两周的时间段。
周数是根据开始日期来计算的,然后根据开始和结束日期来创建或获取新的 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 )
所以 timesheets_week_1
包含了所有属于第1周的时间表。