使用外键Django Rest Framework创建记录

时间:2017-10-18 10:07:15

标签: django serialization django-rest-framework

DRF 3.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"
}

但是我收到了错误:

  

/ mytest /的AssertionError   默认情况下,.create()方法不支持可写嵌套字段。   为序列化程序.create()编写明确的myapp.serializers.StudentSerializer方法,或在嵌套的序列化程序字段上设置read_only=True

不知道如何解决这个问题 - 我应该为学校外键提供什么?

提前致谢

1 个答案:

答案 0 :(得分: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)