在django admin的save_model方法中处理m2m记录

时间:2012-05-17 23:07:48

标签: python django django-admin

我有两个型号,

class Course(models.Model):
    #bunch of fields
    students = models.ManyToManyField(Student)

class Student(models.Model):
    #bunch of fields

现在,我没有在课程管理屏幕中使用“常规”m2m小部件,而是在CourseAdminForm中添加了一个文件上传字段,以上传带有学生ID的文本文件。我在CourseAdmin.save_model方法中处理文件,迭代学生列表,如

def save_model(self, request, obj, form, change):
    #some other stuff
    #...
    obj.save()

    #obtain student_ids from uploaded file
    #...        
    for id in student_ids:
        s = Student.objects.get(pk=id)
        course.students.add(s)
    obj.save() #not sure this second one is needed

事实证明,这不起作用: m2m关系未保存。根据我的阅读,我理解这是因为整个save_model方法在事务中发生,在提交之后,m2m关系被清除并再次保存,如果它们来自m2m小部件。因此,我的问题是我需要手工操纵这些关系,而我却无法找到一种方法(或一个地方)去做。

问题是:我怎样才能实现以编程方式添加m2m关系的预期结果?