Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带有嵌套序列化程序的Django视图_Python_Django_Serialization - Fatal编程技术网

Python 带有嵌套序列化程序的Django视图

Python 带有嵌套序列化程序的Django视图,python,django,serialization,Python,Django,Serialization,我有以下模型结构: 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.CharFie

我有以下模型结构:

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)
使用序列化程序:

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")
视图集:

class ParentViewSet(GenericViewSet, RetrieveModelMixin, CreateModelMixin, UpdateModelMixin):
    serializer_class = ParentSerializer
    queryset = Parent.objects.all()
但是,调用ParentViewSet时,我只接收该模型的字段,而不是其所有相关子模型的组合

返回值:

{
 "name": "test"
}

您可以修改模型,如下所示:

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")
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
然后在序列化程序中,您可以指定如下内容:

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")
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

在子序列化程序
many=True
中,因为多个子项可以具有指向父项的foreignkey,因此每个父项可能有多个子项。如果您想只返回一个子模型,那么可以设置为
many=False
,但要确保在实例中只传递一个子模型,您可以修改模型,如下所示:

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")
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
然后在序列化程序中,您可以指定如下内容:

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")
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

在子序列化程序
many=True
中,因为多个子项可以具有指向父项的foreignkey,因此每个父项可能有多个子项。如果您想只返回一个子对象,那么您可以使
many=False
,然后确保您在实例中只传递了一个子对象模型

Is
SocialMediaContextContainer
Parent
模型相同吗?还是输入错误?两个子字段名都无法解析。Define
source=
@JPG抱歉,这是一个打字错误,我更新了code@Ivan我应该在哪里定义
?社交媒体文本容器和
模型是否相同?还是输入错误?两个子字段名都无法解析。Define
source=
@JPG抱歉,这是一个打字错误,我更新了code@Ivan我应该在哪里定义
源代码
?这是否也适用于更新,或者我必须重写
更新
方法?Django_rest_框架不支持嵌套更新,您需要重写并提供您的自定义逻辑。但是
parent.child1
自child1起将不起作用,因为它不是该模型的实例!?那么这是否也适用于更新,或者我必须重写
update
方法?Django_rest_框架不支持嵌套更新,您需要重写并提供自定义逻辑。但是
parent.child1
自child1以来将不起作用,因为它不是该模型的实例!?