Как реализовать рекурсивность в сериализаторах Django

Мой класс сериализаторов

class ConditionSerializers(serializers.ModelSerializer):
 
 class Meta:
     model = TblCondition
     fields = ['id','operator','condition','relation']

class ConditionSerializers(serializers.ModelSerializer):
 relation_with=ConditionSerializers(many=False)
 class Meta:
     model = TblCondition
     fields = ['id','operator','relation_with','condition','relation']


class RuleSerializers(serializers.ModelSerializer):

 conditiontbl=ConditionSerializers(many=True)

 class Meta:
     model = TblRule
     fields = ['rule_table_no','rule_no','rule_name','columns','data_file','true','conditiontbl' ]

Мой класс модели

class TblRule(models.Model):
    rule_table_no=models.AutoField(primary_key=True)
    rule_no=models.IntegerField(blank=False)
    rule_name=models.CharField(max_length=100,blank=False)
    columns=models.CharField(max_length=100)
    data_file=models.CharField(max_length=100)
    true=models.CharField(max_length=100)


class TblCondition(models.Model):
    rule=models.ForeignKey(TblRule, on_delete=models.CASCADE,related_name='conditiontbl')
    operator=models.CharField(max_length=100)
    condition=models.CharField(max_length=100)
    relation=models.CharField(max_length=50,blank=True)
    relation_with=models.OneToOneField(to='self',null=True,blank=True,on_delete=models.CASCADE)

Получение этих результатов в postman API путем вызова моделей ruletbl

[
    {
        "rule_table_no": 2,
        "rule_no": 1,
        "rule_name": "Age Discritization",
        "columns": "Age",
        "data_file": "Data1",
        "true": "Teen",
        "conditiontbl": [
            {
                "id": 4,
                "operator": ">",
                "relation_with": null,
                "condition": "15",
                "relation": ""
            },
            {
                "id": 5,
                "operator": "<=",
                "relation_with": {
                    "id": 4,
                    "operator": ">",
                    "condition": "15",
                    "relation": ""
                },
                "condition": "25",
                "relation": "and"
            }
        ]
    },
    {
        "rule_table_no": 3,
        "rule_no": 1,
        "rule_name": "Age Discritization",
        "columns": "Age",
        "data_file": "Data1",
        "true": "Young",
        "conditiontbl": []
    }
]

Вы можете видеть филы списка conditiontbl в модели ruletbl (например, в результатах JASON), внутри фила conditiontbl у нас есть объекты моделей tblcondition с филами ("relation_with"), и этот фил relation_with снова ссылается на свою собственную модель tblcondition, вы можете видеть его второй объект. Я хочу, чтобы эта ссылка в файлах relation_with на свою собственную модель conditiontbl была рекурсивной. Есть решение?

В Django рекурсивная сериализация может быть реализована путем создания пользовательского класса сериализатора, который расширяет класс BaseSerializer и переопределяет метод to_representation()

from django.core.serializers import serialize

from django.core.serializers.json import DjangoJSONEncoder from django.db import models from rest_framework import serializers

class Node(models.Model): parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True) value = models.CharField(max_length=255)

class NodeSerializer(serializers.HyperlinkedModelSerializer): class Meta: модель = Node поля = ('url', 'parent', 'value')

root = Node.objects.get(pk=1)

serialized_data = serialize('json', [root], cls=DjangoJSONEncoder)

Вернуться на верх