在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的教师应该有一个蓝色或红色相关的CourseGroup。当老师有2级时,没关系,什么都行。
接下来,当级别为1时,CourseGroup应始终包含楼层值为2的课程。
保存教师时,它不知道哪些课程即将相关。在创建时,它甚至没有Course.id,当它出现时,它不知道在 save()之后会出现哪些关系。
现在可能的解决方案:调整save()方法,给出一个课程列表。使用transaction.atomic保存对象,设置关系并使用该状态验证对象。如果它未验证,则引发验证错误和回滚。
现在剩下的问题是对第二个要求的验证。在保存教师时,它可能会在CourseGroup上验证确定,因为每个组都包含一个Floor2课程。但是,在保存教师之后,当某个课程从CourseGroup中删除,而教师不再进行验证时该怎么办?
有没有人能更好地解决这个问题?