[英]Django views with nested serializers
I have the following model structure: 我具有以下模型结构:
class Parent(models.Model):
name = models.CharField(max_length=100)
class Child1(models.Model):
name = models.CharField(max_length=100)
parent = models.ForeignKey(Parent)
class Child2(models.Model):
name = models.CharField(max_length=100)
parent = models.ForeignKey(Parent)
With the serializers: 使用序列化器:
class Child1Serializer(serializers.ModelSerializer):
class Meta:
model = Child1
fields = (
"name",
)
class Child2Serializer(serializers.ModelSerializer):
class Meta:
model = Child2
fields = (
"name",
)
class ParentSerializer(serializers.ModelSerializer):
child1_ctx = Child1Serializer(many=False, required=False)
child2_ctx = Child2Serializer(many=False, required=False)
class Meta:
model = Parent
fields = (
"name",
"child1_ctx",
"child2_ctx"
)
read_only_fields = ("name")
The ViewSet: ViewSet:
class ParentViewSet(GenericViewSet, RetrieveModelMixin, CreateModelMixin, UpdateModelMixin):
serializer_class = ParentSerializer
queryset = Parent.objects.all()
However, when calling the ParentViewSet I only receive the fields for that model and not a combination of all its related submodels!? 但是,当调用ParentViewSet时,我仅接收该模型的字段,而不接收其所有相关子模型的组合!
Return value: 返回值:
{
"name": "test"
}
You can modify your models something like this: 您可以修改模型,如下所示:
class Parent(models.Model):
name = models.CharField(max_length=100)
class Child1(models.Model):
name = models.CharField(max_length=100)
parent = models.ForeignKey(Parent, related_name="children1")
class Child2(models.Model):
name = models.CharField(max_length=100)
parent = models.ForeignKey(Parent, related_name="children2")
Then in serializer you can specify something like this: 然后,在序列化程序中,您可以指定如下所示的内容:
class ParentSerializer(serializers.ModelSerializer):
child1 = serializers.SerializerMethodField()
child2 = serializers.SerializerMethodField()
class Meta:
model = Parent
fields = (
"name",
"child1",
"child2",
)
read_only_fields = ("name")
def get_child1(self, parent):
return Child1Serializer(many=True, instance=parent.children1.all()).data
def get_child2(self, parent):
return Child2Serializer(many=True, instance=parent.children2.all()).data
In child serializer many=True
because several childs can have foreignkey to parent, so for each parent there maybe more than 1 child. 在子序列化器中,
many=True
是因为几个孩子可以为父代添加外键,因此对于每个父代,可能会有一个以上的孩子。 If you want to return only single child, then you can make many=False
but then make sure you're passing only single child model in instance 如果只想返回一个孩子,则可以使
many=False
但要确保在实例中仅传递一个孩子模型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.