简体   繁体   English

如何在 Django 序列化程序中实现递归

[英]How to implement recursive in Django Serializers

My serializers class我的序列化器类

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' ]

My model class我的模型课

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)

Getting these results in postman API by calling ruletbl models通过调用 ruletbl 模型在邮递员 API 中获取这些结果

[
    {
        "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": []
    }
]

Results I want:我想要的结果:

[
  {
    "rule_table_no": 2,
    "rule_no": 1,
    "rule_name": "Age Discritization",
    "columns": "Age",
    "data_file": "Data1",
    "true": "Teen",
    "conditiontbl": [
      {
        "id": 7,
        "operator": ">",
        "relation_with": null,
        "condition": "15",
        "relation": ""
      },
      {
        "id": 6,
        "operator": "<=",
        "relation_with": {
          "id": 7,
          "operator": ">",
          "relation_with":  
           {
            "id": 7,
            "operator": ">",
            "relation_with": null,
            "condition": "15",
            "relation": ""
          },



          "condition": "15",
          "relation": "or"
        },
        "condition": "25",
        "relation": "and"
      }
    ]
  },
  {
    "rule_table_no": 3,
    "rule_no": 1,
    "rule_name": "Age Discritization",
    "columns": "Age",
    "data_file": "Data1",
    "true": "Young",
    "conditiontbl": []
  }
]

You can see conditiontbl list fileds in ruletbl model (eg in JASON results), inside conditiontbl filed we have objects of tblcondition models with fileds ("relation_with"), and this relation_with filed is again refering to its own tblcondition model you can see its second object.您可以在 ruletbl 模型中看到 conditiontbl 列表字段(例如在 JASON 结果中),在 conditiontbl 字段中我们有带有字段(“relation_with”)的 tblcondition 模型的对象,并且这个 relation_with 字段再次引用它自己的 tblcondition 模型,您可以看到它的第二个目的。 I want this refering in relation_with fileds to its own conditiontbl model to be recursive.我希望这个在 relation_with fileds 中引用到它自己的 conditiontbl 模型是递归的。 Any solution?任何解决方案?

In Django, recursive serialization can be implemented by creating a custom serializer class that extends the BaseSerializer class and overrides the to_representation() method在 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:
        model = Node
        fields = ('url', 'parent', 'value')

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM