2017-10-18 166 views
0

DRF 3.7.1的新特性和嘗試使用POST創建包含外鍵的對象時遇到問題。該方案是我有一個學生 - 學校模型(一個學校有很多學生) - 下面的例子:使用外鍵創建記錄Django Rest Framework

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') 

串行器看起來像:

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') 

假設一所學校存在(學校ID =「ABC」 )我試圖張貼此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

你需要創建一個明確的create方法,如DRF不會爲你做這個默認。例如:

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) 
相關問題