使用外键Django Rest框架创建记录

使用外键Django Rest框架创建记录,django,serialization,django-rest-framework,Django,Serialization,Django Rest Framework,DRF3.7.1的新版本,我在尝试使用POST创建包含外键的对象时遇到了一个问题。场景是我有一个学生-学校模型(一个学校有很多学生)-示例如下: class School(models.Model): school_id = models.CharField(primary_key=True,max_length=10) school_name = models.CharField(max_length=100) school_address = models.CharF

DRF3.7.1的新版本,我在尝试使用POST创建包含外键的对象时遇到了一个问题。场景是我有一个学生-学校模型(一个学校有很多学生)-示例如下:

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')
假设学校存在(school_id='ABC'),我将尝试发布此JSON以创建学生:

{
  "student_name": "John Doe",
  "school_id": "ABC"
}
但是我得到了一个错误:

断言错误at/mytest/ 默认情况下,
.create()
方法不支持可写嵌套字段。 为序列化程序
myapp.serializer.StudentSerializer
编写一个显式的
.create()
方法,或在嵌套的序列化程序字段上设置
read\u only=True

不确定如何修复此问题-我应该为学校外键引用什么


提前感谢

您需要创建一个显式的
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)