Django-OneToOne关系-如何序列化它?

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

简单的示例student and employee类,我想将其序列化如下,它应该是一对一关系:

{
  "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示例。我想我们讨论的细节太多了。