使用外键创建记录Django Rest Framework

问题描述:

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.

不知道如何解决这个问题 - 我应该参考学校的外键?

在此先感谢

你需要创建一个明确的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)