如何根据数据库中的数据反向关系N次序列化

时间:2019-05-21 06:30:57

标签: django django-models django-rest-framework

我想构造一个类似于结构的二叉树(使用反向关系)

report_to字段为null的雇员位于树的顶部(A级),使用反向序列化程序,我可以获取其受控雇员列表(B级)。但是,如果B级雇员正在控制某些雇员,则我必须反向关联该雇员列表(C级)。一些B级员工可能有也可能没有员工向他们报告。那么C级员工可能有也可能没有员工向他们报告,因此直到最后一位员工为止,树会长大。

我有一个员工表和job_info表

        class employee(models.Model):    
            first_name = models.CharField(max_length = 50)
            last_name = models.CharField(max_length = 50)

        class job_info(models.Model):
            employeeid = models.OneToOneField(employee, on_delete = models.CASCADE)
            report_to = models.ForeignKey(employee, on_delete = models.SET_NULL,related_name = "supervisor", null = True)

如果我需要找到数量有限的反向序列化器,则可以编写所需数量的反向关系序列化器。但就我而言,这棵树可能是(0级)到(N级)。那么我该如何写一个可以处理N个反向序列化器的序列化器

1 个答案:

答案 0 :(得分:2)

想到这一点的快速方法是 SerializerMethodField 。 像这样:

class Employee(models.Model):
    first_name = models.CharField(max_length = 50)
    last_name = models.CharField(max_length = 50)

class JobInfo(models.Model):
    employee = models.OneToOneField(Employee, related_name='get_job_info')
    supervisor = models.ForeignKey(Employee, related_name='get_sub_employees_info')

class JobTreeSerializer(serializers.ModelSerializer):
    class Meta:
        model = JobInfo
        fields = ('employee', 'sub_employees')

    sub_employees = serializers.SerializerMethodField()

    def get_sub_employees(self, job_info):
        return __class__(job_info.employee.get_sub_employees_info.all(), many=True).data

请注意__class__引用JobTreeSerializer,就像在嵌套相同的序列化器一样。