2017-06-26 1 views
1

Django 1.6でPython 2.7.13(x86)で例外が発生しましたが、これを修正する方法がわかりません。私はすでに答えのために他の投稿を検索しましたが、役に立たなかった。 私はこれについていて、しばらく車輪を回転させています。Django 1.6、all()throwsエラー:中間モデルを指定するManyToManyFieldに値を設定できません

Cannot set values on a ManyToManyField which specifies an intermediary model. Use MyApp.ClassStudents's Manager instead. 
:これは私が取得していますエラーメッセージです

myNewClass.class_students = selectedClass.class_students.all() 

は、以下の完全なコード例を参照してください...:

これは例外をスローしたコードの行があります

(上記のエラーメッセージの場合、私のアプリは「MyApp」と呼ばれます...)

all()がうまくいかないようですが、これを修正するにはどうしますか? あなたは私がこれを解決するのを助けるか、少なくとも正しい方向に私を向けることができますか?

ありがとう。ここで

は私のコードです:ここでは

class Class(models.Model): 

    courseNumber = models.IntegerField() 
    courseName = models.CharField(max_length = 32) 

    class_students = models.ManyToManyField(Student, blank = True, through = 'ClassStudent') 

class Student(models.Model): 

    studentName = models.CharField(max_length = 32) 
    overallStudentGPA = models.IntegerField()  

class ClassStudent(models.Model): 

    myClass = models.ForeignKey(Class, on_delete = models.CASCADE) 
    myStudent = models.ForeignKey(Student, on_delete = models.CASCADE) 

    studentClassGrade = models.IntegerField() 

def copy_class(modeladmin, request, queryset): 
    for selectedClass in queryset: 

     myNewClass = Class(courseNumber = selectedClass.courseNumber, courseName = selectedClass.courseName) 

     myNewClass.courseNumber = selectedClass.courseNumber 
     myNewClass.courseName = selectedClass.courseName 

     # Throws an error: 
     # Cannot set values on a ManyToManyField which specifies an intermediary model. Use MyApp.ClassStudents's Manager instead. 
     myNewClass.class_students = selectedClass.class_students.all() 
+0

myNewClassを保存してから 'selectedClass.class_students.all()'をループし、新しいClassを指す 'ClassStudent'の新しいインスタンスを作成することができます。 –

+0

これを直接設定できない理由は、ドキュメントで説明されています。 [通常の多対多フィールドと異なり、リレーションシップを作成するためにadd()、create()、またはset()を使用することはできません](https://docs.djangoproject.com/ja/1.11/topics/db/)モデル/#余分なフィールドの多対多関係) –

+0

ありがとうございました! – Erik343

答えて

0

は私が思いついた答えです:

def copy_class(modeladmin, request, queryset): 

    myNewClass = Class(courseNumber = selectedClass.courseNumber, courseName = selectedClass.courseName) 

    myNewClass.courseNumber = selectedClass.courseNumber 
    myNewClass.courseName = selectedClass.courseName 

    myNewClass.save() 

    for studentObj in selectedClass.class_students.all(): 

     oneClassStudentObj = ClassStudents.get(class = selectedClass, student = studentObj) 

     tempStudentClassGrade = oneClassStudentObj.studentClassGrade 

     tempClassStudent = ClassStudent(myClass = myNewClass, myStudent = studentObj, studentClassGrade = tempStudentClassGrade) 

     tempClassStudent.save() 

ClassStudentオブジェクトを取得する代わりに、直接の方法があった場合、私はちょうど思っていましたClassStudents.get(...)を使用する必要がありますか?しかし、動作します...

関連する問題