Как изменить отношение сериализации N раз на основе данных в базе данных - PullRequest
1 голос
/ 21 мая 2019

Я хочу построить структуру, подобную бинарному дереву (используя обратную связь)

сотрудник с полем report_to, равным null, является вершиной дерева (оценка A), с помощью обратного сериализатора я могу получить список контролируемых сотрудников (оценка B). но если сотрудник класса B контролирует некоторых сотрудников, то я должен пересмотреть связь этого списка сотрудников (уровень C). некоторые сотрудники категории B могут иметь или не иметь сотрудника, отчитывающегося перед ними. тогда сотрудник класса С может иметь или не иметь подчиненного сотрудника, и поэтому дерево растет до последнего сотрудника.

У меня есть таблица сотрудников и таблица 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 Ответ

2 голосов
/ 21 мая 2019

Быстрый способ думать об этом: 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, это все равно что вкладывать один и тот же сериализатор в себя.

...