Django OneToOne 关系 - 如何序列化它? [英] Django OneToOne relationship - how to serialize it?

查看:72
本文介绍了Django OneToOne 关系 - 如何序列化它?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Simple example student and employee class, I want to serialize it like below and it should be OneToOne relationship:

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

我不确定我做错了什么.我正在尝试更改一些内容,但仍然有不同的错误.我确定这很简单,而且我遗漏了一些东西..此刻我有:

I'm not sure what I'm doing wrong. I'm trying to change a few things, still have different errors. I'm sure that it's simple and I'm missing something.. At this moment I have:

NOT NULL constraint failed: rest_student.employee_id

答案:一对一关系序列化程序

希望对某人有所帮助.

推荐答案

尽量关注 这个 答案.

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

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

To retrieve all students or employee you don't need to add def create(self, validated_data):. This is required for updating/creating nested objects.

这篇关于Django OneToOne 关系 - 如何序列化它?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆