使用ManytoMany关系要求验证对象

时间:2014-11-28 13:34:41

标签: django validation many-to-many

在Django中使用manytomany关系时,我正在努力解决验证问题。

class CourseGroup(models.Model):
    name = models.CharField(max_length=255)
    color = models.Charfield(max_length=255, choices=(
        ('blue', 'Blue'), ('red', 'Red'),
        ('white', 'White')),
        helpt_text='Education level')


class Course(models.Model):
    name = models.CharField(max_length=255)
    location = models.CharField(max_length=255)
    floor = models.IntegerField()
    courses = models.ManyToManyField('Course', related_name='courses')

class Teacher(models.Model):
    course_groups = models.ManyToManyField('Course', related_name='teachers')
    name = models.CharField(max_length=255)
    level = models.Charfield(max_length=1, choices=(
        ('1', 'Level 1'), (2, 'Level 2')), helpt_text='Education level')

    def validate_courses(self):
        if self.level == '1':

            groups = self.course_groups.all().prefetch_related('courses')

            color_groups = groups.filter(color__in=['red', 'blue'])
            not_has_red_or_blue = color_groups.count() < 1
            if not_has_red_or_blue:
                raise ValidationError(NotHasRedOrBlueError)

            for group in groups:
                courses = group.courses.filter(floor__eq=2)
                floor_incorrect = courses.count() < 1
                if floor_incorrect:
                    raise ValidationError(FloorNotMatchingError)

    def save(self, course_list, **kwargs):

        with transaction.atomic:
            super(Teacher, self).save()
            self.course.add(course_list)
            self.validate_courses()

我的问题是:

教师只有在相对于其课程组进行验证时才能保存:

  1. 级别为1的教师应该有一个蓝色或红色相关的CourseGroup。当老师有2级时,没关系,什么都行。

  2. 接下来,当级别为1时,CourseGroup应始终包含楼层值为2的课程。

  3. 保存教师时,它不知道哪些课程即将相关。在创建时,它甚至没有Course.id,当它出现时,它不知道 save()之后会出现哪些关系。

    现在可能的解决方案:调整save()方法,给出一个课程列表。使用transaction.atomic保存对象,设置关系并使用该状态验证对象。如果它未验证,则引发验证错误和回滚。

    现在剩下的问题是对第二个要求的验证。在保存教师时,它可能会在CourseGroup上验证确定,因为每个组都包含一个Floor2课程。但是,在保存教师之后,当某个课程从CourseGroup中删除,而教师不再进行验证时该怎么办?

    有没有人能更好地解决这个问题?

0 个答案:

没有答案