0

私はコースに関連するプロジェクトを書いています。ただし、Django admin を使用して CourseSession を追加すると、save() が機能しません。しかし、編集して保存すると機能します。私を助けてください。以下はクラス CourseSession と Course です。ここで行っているのは、関連するコース セッションが追加されたときに、各コースのインストラクターを自動的に更新することです。(更新: m2m_change 関数を使用しましたが、コース セッションを削除すると機能しません)</p>

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
4

1 に答える 1

1

インスタンスが一度保存されるまで多対多フィールドを設定できないため、最初は機能しません (別のテーブルに保存され、リンク先の ID が必要なため)。そのため、管理者は保存後まで値を設定しません。

save をオーバーライドするのではなく、おそらくm2m_changedsignalを使用することをお勧めします。

于 2013-07-05T09:29:22.030 に答える