2017-10-18 17 views
0

DRF 3.7.1の新機能で、POSTを使用して外部キーを含むオブジェクトを作成しようとすると問題が発生します。学校は(school_id =「ABC」が存在すると仮定すると、外部キーでレコードを作成するDjango Rest Framework

class SchoolSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = School 
     fields = ('school_id','school_name','school_address') 

class StudentSerializer(serializers.ModelSerializer): 

    school = SchoolSerializer() 

    class Meta: 
     model = Student 
     fields = ('student_name','school') 

:シリアライザがどのように見える

class School(models.Model): 
    school_id = models.CharField(primary_key=True,max_length=10) 
    school_name = models.CharField(max_length=100) 
    school_address = models.CharField(max_length=255) 
    # other fields omitted 

class Student(models.Model): 
    student_name = models.CharField(max_length=100) 
    # other fields omitted 
    school = models.ForeignKey('School') 

:以下の例 - 学校のモデル(1校は、多くの学生を持っている) - シナリオは、私が学生を持っています)私は学生を作成するには、このJSONを投稿しようとしている:

{ 
    "student_name": "John Doe", 
    "school_id": "ABC" 
} 

が、エラーを取得しています:

AssertionError at /mytest/ The .create() method does not support writable nested fields by default. Write an explicit .create() method for serializer myapp.serializers.StudentSerializer , or set read_only=True on nested serializer fields.

これを修正する方法がわかりません。私は学校の外部キーについて何を参照する必要がありますか?事前

答えて

0

おかげDRFは、デフォルトではあなたのためにこれをしないとあなたは、明示的なcreateメソッドを作成する必要があります。例:

class StudentSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Student 
     fields = ('student_name','school') 

    def create(self, data): 
     school, __ = School.objects.get_or_create(school_id=data["school_id"]) 
     return Student(student_name=data["student_name"], school=school) 
関連する問題