如何将其与特定模型联系起来

问题描述 投票:0回答:1

我收到以下错误:

null value in column "two_week_period_id" of relation "timesheets_usertimesheet" violates not-null constraint

我理解这是因为最后一个空值没有被传递。这是我的模型:

模型.py

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)

上面每输入两周创建一个

two_week_period
作为 id。例如,03/10/2024-03/14/2024 是
two_week
id
1,接下来的两周将添加 id 2 等等。

我正在尝试将

two_week_period
CreateNewTimesheet
传递给:

UserTimesheet 的简化版

class UserTimesheet(models.Model):
    employee = models.ForeignKey(Employee, models.SET_NULL, blank=True, null=True)
    start_date = models.DateField(_("Start Date"))
    end_date = models.DateField(_("End Date"))
    two_week_period = models.ForeignKey(TwoWeekPeriod, on_delete=models.CASCADE)

似乎没有

two_week_period
模型中的
Usertimesheet
,我没有收到此错误。但我想显示
two_week_period
,以便我可以将两周绑定到一张时间表(用于数据和存储记录)。

有更好的方法来系

two_week_id
吗?我这样做有错吗?

没有

two_week_period = models.ForeignKey(TwoWeekPeriod, on_delete=models.CASCADE)
它工作得很好,当然只是传递一个空值。

感谢任何和所有帮助。

django django-models django-crispy-forms
1个回答
0
投票

我能够弄清楚这一点。我刚刚对 UserTimesheet 模型执行了此操作。

class UserTimesheet(models.Model):
    employee = models.ForeignKey(Employee, models.SET_NULL, blank=True, null=True)
    start_date = models.DateField(_("Start Date"))
    end_date = models.DateField(_("End Date"))
    two_week_period = models.ForeignKey(TwoWeekPeriod, on_delete=models.CASCADE)


     def save(self, *args, **kwargs):
         # Determine the week number for this timesheet
         week_number = (self.start_date - timezone.now().date()).days // 14 + 1
        
         # Find or create the corresponding TwoWeekPeriod instance
         two_week_period, _ = TwoWeekPeriod.objects.get_or_create(
             start_date=self.start_date,
             end_date=self.end_date,
             defaults={'week_number': week_number}
           )
        
         # Assign the TwoWeekPeriod to the timesheet
         self.two_week_period = two_week_period
        
         super().save(*args, **kwargs)
© www.soinside.com 2019 - 2024. All rights reserved.