使用外键创建记录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 serializermyapp.serializers.StudentSerializer
, or setread_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)