[英]How to implement recursive in Django Serializers
我的序列化器類
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)
通過調用 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": []
}
]
我想要的結果:
[
{
"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": []
}
]
您可以在 ruletbl 模型中看到 conditiontbl 列表字段(例如在 JASON 結果中),在 conditiontbl 字段中我們有帶有字段(“relation_with”)的 tblcondition 模型的對象,並且這個 relation_with 字段再次引用它自己的 tblcondition 模型,您可以看到它的第二個目的。 我希望這個在 relation_with fileds 中引用到它自己的 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:
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.