0

我有两个模型,

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 关系的预期结果?

4

1 回答 1

1

You can either connect to the m2m_changed signal https://docs.djangoproject.com/en/dev/ref/signals/#m2m-changed, or use Django 1.4's new "save_related" - https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_related which closed ticket 16115 https://code.djangoproject.com/ticket/16115

See also https://stackoverflow.com/a/8462541/640759

于 2012-05-18T00:32:24.123 回答