为每个嵌套的序列化程序获取单独的序列化程序响应
Get separate serializer response for each nested serializer
卡在序列化程序中,我需要基于嵌套序列化程序的序列化响应。
Models.py :
class Parent(models.Model):
name = models.CharField(max_length=50)
class Child(models.Model):
parent = models.ForeignKey(Parent, related_name='children')
child_name = models.CharField(max_length=80)
Serialziers.py
class ChildSerializer(serializers.ModelSerializer):
class Meta:
model = Child
fields = '__all__'
class ParentSerializer(serializers.ModelSerializer):
child = serializers.SerializerMethodField()
def get_child(self, obj):
childs = Child.objects.filter(parent=obj)
return ChildSerializer(childs, many=True).data
class Meta:
model = Parent
fields = '__all__'
我在嵌套的地方得到如下所示的输出 childs:
{
id : 1,
name : "Parent1",
child: [
0: {id : 1, child_name : "child1"}
1: {id : 2, child_name : "child2"}
]
}
但出于某些商业目的,我需要输出如下所示,其中序列化程序应基于 child。即对于每个 child 应该有单独的 Parent 序列化器。它是否具有相同的 id 和其他字段并不重要。 :
{
0:{
id : 1,
name : "Parent1",
child: [
0: {id : 1, child_name : "child1"}
]
}
1:{
id : 1,
name : "Parent1",
child: [
0: {id : 2, child_name : "child2"}
]
}
}
另外请告诉我是否可以基于 child 序列化程序进行过滤。即 childs
我将传递给 Parent 序列化程序并为每个 childs 获得响应。
尝试如下更改 Parent Serializer。
class ParentSerializer(serializers.ModelSerializer):
children = ChildSerializer(read_only=True)
def to_representation(self, instance):
child_query = Child.objects.filter(parent=instance)
num_childs = child_query.count()
ret_instance = {}
for idx in range(num_childs):
children = ChildSerializer(child_query[idx:idx + 1], many=True).data
for child in children:
child.pop('parent', None)
temp_dict = {
'id': instance.id,
'name': instance.name,
'child': children
}
ret_instance[idx] = temp_dict
return ret_instance
class Meta:
model = Parent
fields = '__all__'
要更改序列化程序响应的表示,需要使用 to_representation() 方法。
我直接在parent序列化器中传递了childs对象,并根据它进行过滤。这对我有用。
class ChildSerializer(serializers.ModelSerializer):
class Meta:
model = Child
fields = '__all__'
class ParentSerializer(serializers.ModelSerializer):
name = serializers.ReadOnlyField(source='parent.name')
child = serializers.SerializerMethodField()
def get_child(self, obj):
childs = Child.objects.filter(id=obj.id)
return ChildSerializer(childs, many=True).data
class Meta:
model = Parent
fields = ("childs", "name")
然后直接将parent中的child对象传过去
child = Child.objects.all()
ParentSerializer(child, many=True)
卡在序列化程序中,我需要基于嵌套序列化程序的序列化响应。
Models.py :
class Parent(models.Model):
name = models.CharField(max_length=50)
class Child(models.Model):
parent = models.ForeignKey(Parent, related_name='children')
child_name = models.CharField(max_length=80)
Serialziers.py
class ChildSerializer(serializers.ModelSerializer):
class Meta:
model = Child
fields = '__all__'
class ParentSerializer(serializers.ModelSerializer):
child = serializers.SerializerMethodField()
def get_child(self, obj):
childs = Child.objects.filter(parent=obj)
return ChildSerializer(childs, many=True).data
class Meta:
model = Parent
fields = '__all__'
我在嵌套的地方得到如下所示的输出 childs:
{
id : 1,
name : "Parent1",
child: [
0: {id : 1, child_name : "child1"}
1: {id : 2, child_name : "child2"}
]
}
但出于某些商业目的,我需要输出如下所示,其中序列化程序应基于 child。即对于每个 child 应该有单独的 Parent 序列化器。它是否具有相同的 id 和其他字段并不重要。 :
{
0:{
id : 1,
name : "Parent1",
child: [
0: {id : 1, child_name : "child1"}
]
}
1:{
id : 1,
name : "Parent1",
child: [
0: {id : 2, child_name : "child2"}
]
}
}
另外请告诉我是否可以基于 child 序列化程序进行过滤。即 childs
我将传递给 Parent 序列化程序并为每个 childs 获得响应。
尝试如下更改 Parent Serializer。
class ParentSerializer(serializers.ModelSerializer):
children = ChildSerializer(read_only=True)
def to_representation(self, instance):
child_query = Child.objects.filter(parent=instance)
num_childs = child_query.count()
ret_instance = {}
for idx in range(num_childs):
children = ChildSerializer(child_query[idx:idx + 1], many=True).data
for child in children:
child.pop('parent', None)
temp_dict = {
'id': instance.id,
'name': instance.name,
'child': children
}
ret_instance[idx] = temp_dict
return ret_instance
class Meta:
model = Parent
fields = '__all__'
要更改序列化程序响应的表示,需要使用 to_representation() 方法。
我直接在parent序列化器中传递了childs对象,并根据它进行过滤。这对我有用。
class ChildSerializer(serializers.ModelSerializer):
class Meta:
model = Child
fields = '__all__'
class ParentSerializer(serializers.ModelSerializer):
name = serializers.ReadOnlyField(source='parent.name')
child = serializers.SerializerMethodField()
def get_child(self, obj):
childs = Child.objects.filter(id=obj.id)
return ChildSerializer(childs, many=True).data
class Meta:
model = Parent
fields = ("childs", "name")
然后直接将parent中的child对象传过去
child = Child.objects.all()
ParentSerializer(child, many=True)