Как привязать это к конкретной модели

Я получаю следующую ошибку:

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

Как я понимаю, потому что последнее нулевое значение не передается. Вот мои модели:

models.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 в качестве идентификатора для каждых двух введенных недель. Например, 03/10/2024-03/14/2024 - это two_week из id 1, следующие две недели добавят идентификатор 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) все работает нормально, просто передается нулевое значение, разумеется.

Любая помощь будет оценена по достоинству.

Мне удалось разобраться с этим. Я только что сделал это с моделью 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)
Вернуться на верх