我有两个型号,
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关系的预期结果?
答案 0 :(得分:1)
您可以连接到m2m_changed信号https://docs.djangoproject.com/en/dev/ref/signals/#m2m-changed,也可以使用Django 1.4的新“save_related” - https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_related关闭机票16115 https://code.djangoproject.com/ticket/16115