Django Rest Framework对象不可迭代?

22 投票
4 回答
34919 浏览
提问于 2025-05-01 04:22

我有一个模型,它里面有一个外键,我把它序列化了。但是我遇到了一个错误,提示说 'Parent' object is not iterable

这是我的模型文件 models.py:

class Parent(models.Model):
    # Parent data

class Child(models.Model):
    parent = ForeignKey(Parent)

这是我的序列化文件 serializer.py:

class ChildSerializers(serializers.ModelSerializer):
    parent = serializers.RelatedField(many=True)
    class Meta:
        model = ReportField
        fields = (
            'id',
            'parent'
        )

这是我的 API 文件 api.py:

class ChildList(APIView):
    def get(self, request, format=None):
        child = Child.objects.all()
        serialized_child = ChildSerializers(child, many=True)
        return Response(serialized_child.data)

我在想,我可能需要把父级的列表传给子级的列表,但我不太确定最好的方法是什么。

这是我在 api.py 中的尝试:

class ChildList(APIView):
    def get(self, request, format=None):
        child = Child.objects.all()
        parent = Parent.objects.all()
        serialized_child = ChildSerializers(child, many=True)
        serialized_parent = ChildSerializers(parent, many=True)
        return Response(serialized_child.data, serialized_parent.data)
暂无标签

4 个回答

0

把外键(ForeignKey)换成多对多字段(ManyToManyField),这样在序列化的时候,设置为多个(many = True)会更清晰。

在这里输入图片描述

0

如果你在使用一个叫做ModalSerializer的东西,并且在这个模型里有两个外键,那么你可以像下面这样使用“to_representation”这个函数。

def to_representation(self, instance):
        rep = super().to_representation(instance)
        rep['pcatalog_name'] = CatalogSerializer(instance.pcatalog_name).data
        rep['pcategory_name'] = CategorySerializer(instance.pcategory_name).data
        return rep
0

在编程中,有时候我们会遇到一些问题,尤其是在使用特定的工具或库时。比如,有人可能在使用某个库的时候,发现它的功能和自己想要的不太一样。这种情况可能会让人感到困惑,不知道该如何解决。

通常情况下,解决这类问题的方法是查看文档,看看这个库的使用说明,或者在网上搜索一下相关的讨论。很多时候,其他人也遇到过类似的问题,他们可能在论坛上分享了解决方案。

另外,尝试更新库的版本也是一个好主意,因为开发者会不断修复bug和改进功能,更新后可能就能解决你遇到的问题。

总之,遇到问题时,不要慌张,先查资料,看看有没有人遇到过类似的情况,或者尝试更新工具,通常都能找到解决办法。

You can do something like this using python collections as an intermediate

#serializers.py
class TimelineSerializer(serializers.Serializer):
    childs= childSerializer(many=True)
    parents = parentSerializer(many=True)

#apiviews.py
from collections import namedtuple
Timeline = namedtuple('Timeline', ('childs', 'parents'))

def list(self, request):
        timeline = Timeline(
            childs=Child.objects.all(),
            parents=Parent.objects.all(),
        )
        serializer = TimelineSerializer(timeline)
        return Response(serializer.data)
50

为什么要使用many=True?因为Parent只是一个单一的字段,不需要使用明确的序列化字段。直接去掉这些many=True就可以了。

- 这是mariodev在评论中回答的。

撰写回答