Джанго: Проверьте несколько условий перед сохранением модели - PullRequest
0 голосов
/ 21 июня 2019

Это мои models.py:

class Department(models.Model):
name = models.CharField(max_length=20, blank=False, null=False, verbose_name='Department')

def __str__(self):
    return '{}'.format(self.name)

class Users(models.Model):
name = models.CharField(max_length=20, blank=False, null=False, verbose_name='Name')
last_name = models.CharField(max_length=20, blank=False, null=False, verbose_name='Last Name')
department = models.ForeignKey(Department, related_name='user_department', on_delete=models.CASCADE)

def __str__(self):
    return '{} {} - {}'.format(self.name, self.last_name, self.department)

class WeeklyCheck(models.Model):
department = models.ForeignKey(Department, related_name='weeklycheck_department', on_delete=models.CASCADE)
start_date = models.DateField(blank=False, null=True, verbose_name='Start date')
end_date = models.DateField(blank=False, null=True, verbose_name='End Date')
active = models.BooleanField(default=True, verbose_name='Active?')

def __str__(self):
    return '{} / {} to {} - {}'.format(self.department, self.start_date, self.end_date, self.active)

class Attendance(models.Model):
user = models.ForeignKey(Users, related_name='attendance_user', on_delete=models.CASCADE)
date = models.DateField(blank=False, null=True, verbose_name='Date')
check = models.BooleanField(default=True, verbose_name='Check')

def __str__(self):
    return '{} / {} / {}'.format(self.user, self.date, self.check)

def clean(self):
    qs = WeeklyCheck.objects.filter(start_date__lte=self.date, end_date__gte=self.date, active=True)
    department_a = Users.objects.filter(department__name='Department A')
    if not qs and department_a:
        qs = WeeklyCheck.objects.filter(start_date__lte=self.date, end_date__gte=self.date, active=True)
        department_b = Users.objects.filter(department__name='Department B')
        if not qs and department_b:
            qs = WeeklyCheck.objects.filter(start_date__lte=self.date, end_date__gte=self.date, active=True)
            department_c = Users.objects.filter(department__name='Department C')
            if not qs and department_c:
                raise ValidationError('You can not check! The week is not active.')

У меня есть отделы ( Отдел ), в которых есть пользователи ( Пользователи ). Каждый отдел отмечает недели ( WeeklyCheck ), которые имеют дату начала и дату окончания и могут быть или не быть активными. Каждый пользователь проверяет на определенную дату ( Посещаемость ).

Я хочу, чтобы по предварительному назначению в вашем отделе он мог или не может провести проверку.

Я использовал чистый метод, но безрезультатно, поскольку, просто имея активную неделю независимо от отдела, он принимает подтверждение.

...