Django-OneToOne关系-如何序列化它?
简单的示例student and employee类,我想将其序列化如下,它应该是一对一关系:Django-OneToOne关系-如何序列化它?,django,serialization,one-to-one,Django,Serialization,One To One,简单的示例student and employee类,我想将其序列化如下,它应该是一对一关系: { "college": "string", "year": "string", "is_with_college": true, "employee": { "full_name": "string", &qu
{
"college": "string",
"year": "string",
"is_with_college": true,
"employee": {
"full_name": "string",
"email_id": "user@example.com",
"mobile_no": "string",
"is_job_ready": true,
"type": "string",
"location_preference": "string"
}
}
型号:
class Employee(models.Model):
full_name=models.CharField(max_length=100)
email_id=models.EmailField(max_length=100)
mobile_no=models.CharField(max_length=11)
is_job_ready=models.BooleanField(False)
type=models.CharField(max_length=20)
location_preference=models.CharField(max_length=20)
class Student(models.Model):
college=models.CharField(max_length=100)
year=models.CharField(max_length=20)
is_with_college=models.BooleanField()
employee=models.OneToOneField(Employee, on_delete=models.CASCADE)
序列化程序:
class EmployeeSerializer(serializers.ModelSerializer):
class Meta:
model = Employee
fields = ('full_name', 'email_id', 'mobile_no', 'is_job_ready', 'type', 'location_preference')
class StudentSerializer(serializers.ModelSerializer):
employee = EmployeeSerializer(many=False)
class Meta:
model = Student
fields = ('college', 'year', 'is_with_college', 'employee')
def create(self, validated_data):
employee_data = validated_data.pop('employee')
if employee_data:
student = Student.objects.create(**validated_data)
Employee.objects.create(student=student, **employee_data)
return student
观点:
class EmployeeViewSet(viewsets.ModelViewSet):
serializer_class = EmployeeSerializer
queryset = Employee.objects.all()
class StudentViewSet(viewsets.ModelViewSet):
serializer_class = StudentSerializer
queryset = Student.objects.all()
我不确定我做错了什么。我正在尝试改变一些事情,仍然有不同的错误。我确信这很简单,我遗漏了一些东西。。
现在我有:
NOT NULL constraint failed: rest_student.employee_id
答复:
希望它能帮助别人。试着按照答案做
employee=EmployeeSerializer(many=False)
更改为employee=EmployeeSerializer(read\u only=True)
def create(自我验证的\u数据):
。这是更新/创建嵌套对象所必需的
以下是我问题的答案:)
是的,我做了,所以首先我必须将on_delete=models.CASCADE添加到employee=models.OneToOneField。当我试图发布我得到的数据时:“外键约束失败”1
on_delete=models。CASCADE
与创建/检索无关,它是删除对象时唯一的游戏。2.我的答案只针对retrieve
API。为了能够通过一个API调用创建/编辑您的模型结构,请查看本文:1。是的,你说得对。2.不久前,我在这篇文章中做过类似的事情。我把它加在上面了。但是在OnToOne关系中仍然存在同样的问题,并且发布了一些像我上面提到的数据。您从哪里得到这个错误非空约束失败:rest\u student.employee\u id
?在EmployeeViewSet
或StudentViewSet
中,方法是什么:POST、PUT?也许我应该问问如何为我的两个模型,Employee和Student(OneToOne关系)构建序列化程序。我只想使用例如邮递员来发布/获取数据。所以我确信我必须覆盖StudentSerializer中的“create”方法,因为django不支持嵌套序列化程序。我想用来发布我在第一篇文章中添加的数据的json示例。我想我们讨论的细节太多了。