首页 > 解决方案 > Django OneToOne 关系 - 如何序列化它?

问题描述

简单的示例学生和员工类,我想像下面这样序列化它,它应该是 OneToOne 关系:

{
  "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

答案: OneToOne 关系序列化器

希望它可以帮助某人。

标签: djangoserializationone-to-one

解决方案


尝试遵循这个答案。

  1. 更改employee = EmployeeSerializer(many=False)employee = EmployeeSerializer(read_only=True)

  2. 要检索您不需要添加的所有学生或员工def create(self, validated_data):。这是更新/创建嵌套对象所必需的。


推荐阅读