Django OneToOne 관계-직렬화하는 방법?

Nov 14 2020

간단한 예제 학생 및 직원 클래스, 아래와 같이 직렬화하고 OneToOne 관계 여야합니다.

{
  "college": "string",
  "year": "string",
  "is_with_college": true,
  "employee": {
    "full_name": "string",
    "email_id": "[email protected]",
    "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

답변 : OneToOne 관계 직렬 변환기

누군가에게 도움이되기를 바랍니다.

답변

1 tarasinf Nov 14 2020 at 09:31

이 대답 을 따르십시오 .

  1. 변경 employee = EmployeeSerializer(many=False)employee = EmployeeSerializer(read_only=True).

  2. 모든 학생 또는 직원을 검색하려면을 추가 할 필요가 없습니다 def create(self, validated_data):. 중첩 된 개체를 업데이트 / 만들기 위해 필요합니다.

user10620635 Nov 14 2020 at 12:43

내 질문에 대한 대답은 다음과 같습니다. OneToOne Relationship serializer