简体   繁体   English

带有嵌套序列化器的Django视图

[英]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.

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