0

私は2つのモデルを持っています、

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

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

https://stackoverflow.com/a/8462541/640759も参照してください。

于 2012-05-18T00:32:24.123 に答える