删除关系时,Django Python m2m_更改不起作用
我正在写一个与课程相关的项目。但是,当我使用Django admin添加CourseSession时,save()不起作用。但是,当我编辑它,然后保存,它将工作。请帮帮我。以下是课堂授课和课程。我在这里做的是在添加相关课程时自动更新每个课程的讲师。(更新:我使用了m2m_更改功能,但在删除课程时它不起作用)删除关系时,Django Python m2m_更改不起作用,python,django,save,Python,Django,Save,我正在写一个与课程相关的项目。但是,当我使用Django admin添加CourseSession时,save()不起作用。但是,当我编辑它,然后保存,它将工作。请帮帮我。以下是课堂授课和课程。我在这里做的是在添加相关课程时自动更新每个课程的讲师。(更新:我使用了m2m_更改功能,但在删除课程时它不起作用) def course_session_instructor_changed(sender, instance, action, **kwargs): superCourse = instan
def course_session_instructor_changed(sender, instance, action, **kwargs):
superCourse = instance.course
superCourse.instructors.clear()
course_session_set = superCourse.course_session.all()
for each_course_session in course_session_set:
# add instructor
if action=="post_add":
instructors = each_course_session.instructors.all()
for instructor in instructors:
if not instructor in superCourse.instructors.all():
superCourse.instructors.add(instructor)
# remove instructor
elif action=="pre_remove" :
if not each_course_session == instance:
instructors = each_course_session.instructors.all()
for instructor in instructors:
if not instructor in superCourse.instructors.all():
superCourse.instructors.add(instructor)
superCourse.save()
m2m_changed.connect(course_session_instructor_changed, sender=CourseSession.instructors.through)
class CourseSession(models.Model):
course = models.ForeignKey('Course', related_name='course_session')
instructors = models.ManyToManyField(User, related_name = 'instructor_course_session')
enrollment = models.ManyToManyField(User, related_name = 'course_enrollment')
start = models.DateField()
# Weeks of duration
duration = models.IntegerField()
# capacity of the session
max_cap = models.IntegerField()
questionSet = models.ManyToManyField(QuestionSet, blank=True, null=True, related_name='session_questionSet')
class Meta:
verbose_name = _('Session')
verbose_name_plural = _('Sessions')
get_latest_by = "start"
def __unicode__(self):
return unicode(self.instructors.all())+unicode(self.course)+unicode(self.start)
def is_started(self):
return date.today()> self.start
def is_expired(self):
length = timedelta(days = self.duration*7)
return self.start+length< date.today()
def get_enrollment(self):
return self.enrollment.count()
**class Course(models.Model):
name = models.CharField(_('Course Name'),max_length=256)
# Simple Introduction
brief_intro = models.CharField(_('Brief Intro'),max_length=1024)
intro = models.TextField()
learning_obj = models.TextField()
creator = models.ForeignKey(User, related_name = 'course_creator')
created = models.DateTimeField(auto_now_add=True)
cover = models.ImageField(upload_to = 'course/covers/')
institute = models.ForeignKey('Institute', related_name='institute_courses')
workload = models.IntegerField()
assignments = models.IntegerField()
exams = models.IntegerField()
knowledge_tree_root = models.ForeignKey(Topic, related_name='knowledge_tree_root')
instructors = models.ManyToManyField(User, related_name='courses', null=True, blank=True)
#tree_root = models.ForeignKey('Topic')
class Meta:
verbose_name = _('Course')
verbose_name_plural = _('Courses')
def __unicode__(self):
return self.name
def课程会话讲师更改(发送者、实例、操作,**kwargs):
superCourse=instance.course
超级课程.讲师.清除()
course\u session\u set=超级课程.course\u session.all()
对于课程会话集中的每个课程会话:
#添加讲师
如果操作==“post_添加”:
讲师=每个课程会话。讲师。所有()
对于讲师中的讲师:
如果不是superCourse.instructors.all()中的讲师:
超级课程.讲师.添加(讲师)
#罢免讲师
elif操作==“预删除”:
如果不是每个课程会话==实例:
讲师=每个课程会话。讲师。所有()
对于讲师中的讲师:
如果不是superCourse.instructors.all()中的讲师:
超级课程.讲师.添加(讲师)
superCourse.save()
m2m\u已更改。连接(课程会话\u讲师\u已更改,发送方=课程会话。讲师。通过)
班级课程会话(models.Model):
课程=models.ForeignKey('course',related\u name='course\u session')
讲师=模型.ManyToManyField(用户,相关名称='讲师\课程\会话')
注册=模型.ManyToManyField(用户,相关的\u名称='课程\u注册')
start=models.DateField()
#持续数周
持续时间=models.IntegerField()
#会议的能力
max_cap=models.IntegerField()
questionSet=models.ManyToManyField(questionSet,blank=True,null=True,related\u name='session\u questionSet')
类元:
详细名称=(会话)
详细名称复数=(会话)
通过=“开始”获取最新信息
def ___; unicode(自):
返回unicode(self.instructors.all())+unicode(self.course)+unicode(self.start)
def已启动(自):
返回日期.今天()>self.start
def已过期(自身):
长度=时间增量(天数=自身持续时间*7)
返回self.start+length
第一次它不会起作用,因为在实例保存一次之前不能设置多对多字段(因为它们保存在单独的表中,并且必须有一个要链接的ID)。所以管理员在保存之后才设置值
您可能希望使用。我编写了一个m2m\U更改函数,而不是覆盖保存。它在第一次使用时确实有效。但是,当我删除课程会话时,它不会被触发。你能告诉我为什么吗?