对模型按两周分组并与数据录入关联的最佳方法?

3 投票
1 回答
48 浏览
提问于 2025-04-14 17:05

我正在做一个项目,这个项目是基于两周的时间段。我有一个模型,其中有一个 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_dateend_date 归为一组。


Dates: 03/06/2024 - 03/16/2024

And group or tie that to "week 1".

这样做的目的是为了创建一个基于两周时间段的时间表。我需要能够按两周的时间段来分组这些时间表,并将它们与特定的组关联起来。所有的时间表都需要被存储。

在输入 start_dateend_date 后,我希望它们能和第一周关联起来。我在考虑在 CreateNew 模型中添加另一行,然后把它和第一周关联起来。接着,每当输入一个新的 start_dateend_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周的时间表。

撰写回答