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