Python 如何将两个相似的视图组合成一个响应?

Python 如何将两个相似的视图组合成一个响应?,python,django,serialization,django-rest-framework,Python,Django,Serialization,Django Rest Framework,我有两个类似的视图,它们返回相同的序列化响应。视图如下所示: class GetFoos(generics.ListAPIView): # init stuff here def list(self, request): queryset = Foo.objects.filter(owner = request.user) serializer = FooSerializer(queryset, many = True) retu

我有两个类似的视图,它们返回相同的序列化响应。视图如下所示:

class GetFoos(generics.ListAPIView):
    # init stuff here

    def list(self, request):
        queryset = Foo.objects.filter(owner = request.user)
        serializer = FooSerializer(queryset, many = True)
        return Response(serializer.data, status = status.HTTP_200_OK)

class GetFooResponses(generics.ListAPIView):
    # init stuff here

    def list(self, request):
        queryset = FooResponse.objects.filter(owner = request.user)
        serializer = FooResponseSerializer(queryset, many = True)
        return Response(serializer.data, status = status.HTTP_200_OK)
class FooSerializer(serializers.ModelSerializer):
    user = serializers.ProfileInfoSerializer(source = 'owner.userprofile', read_only = True)

    class Meta:
        model = Foo
        fields = ('id', 'name', 'user')

class FooResponseSerializer(serializers.ModelSerializer):
    id = serializers.ReadOnlyField(source = 'foo.id')
    name = serializers.ReadOnlyField(source = 'foo.name')
    user = serializers.ProfileInfoSerializer(source = 'owner.userprofile', read_only = True)

    class Meta:
        model = FooResponse
        fields = ('id', 'name', 'user')
class Foo(models.Model):
    owner = ForeignKey('auth.User', related_name = 'foos')
    name = models.CharField()

class FooResponse(models.Model):
    owner = ForeignKey('auth.User', related_name = 'responses')
    foo = ForeignKey(Foo, related_name = 'responses')
序列化程序如下所示:

class GetFoos(generics.ListAPIView):
    # init stuff here

    def list(self, request):
        queryset = Foo.objects.filter(owner = request.user)
        serializer = FooSerializer(queryset, many = True)
        return Response(serializer.data, status = status.HTTP_200_OK)

class GetFooResponses(generics.ListAPIView):
    # init stuff here

    def list(self, request):
        queryset = FooResponse.objects.filter(owner = request.user)
        serializer = FooResponseSerializer(queryset, many = True)
        return Response(serializer.data, status = status.HTTP_200_OK)
class FooSerializer(serializers.ModelSerializer):
    user = serializers.ProfileInfoSerializer(source = 'owner.userprofile', read_only = True)

    class Meta:
        model = Foo
        fields = ('id', 'name', 'user')

class FooResponseSerializer(serializers.ModelSerializer):
    id = serializers.ReadOnlyField(source = 'foo.id')
    name = serializers.ReadOnlyField(source = 'foo.name')
    user = serializers.ProfileInfoSerializer(source = 'owner.userprofile', read_only = True)

    class Meta:
        model = FooResponse
        fields = ('id', 'name', 'user')
class Foo(models.Model):
    owner = ForeignKey('auth.User', related_name = 'foos')
    name = models.CharField()

class FooResponse(models.Model):
    owner = ForeignKey('auth.User', related_name = 'responses')
    foo = ForeignKey(Foo, related_name = 'responses')
最后,模型如下所示:

class GetFoos(generics.ListAPIView):
    # init stuff here

    def list(self, request):
        queryset = Foo.objects.filter(owner = request.user)
        serializer = FooSerializer(queryset, many = True)
        return Response(serializer.data, status = status.HTTP_200_OK)

class GetFooResponses(generics.ListAPIView):
    # init stuff here

    def list(self, request):
        queryset = FooResponse.objects.filter(owner = request.user)
        serializer = FooResponseSerializer(queryset, many = True)
        return Response(serializer.data, status = status.HTTP_200_OK)
class FooSerializer(serializers.ModelSerializer):
    user = serializers.ProfileInfoSerializer(source = 'owner.userprofile', read_only = True)

    class Meta:
        model = Foo
        fields = ('id', 'name', 'user')

class FooResponseSerializer(serializers.ModelSerializer):
    id = serializers.ReadOnlyField(source = 'foo.id')
    name = serializers.ReadOnlyField(source = 'foo.name')
    user = serializers.ProfileInfoSerializer(source = 'owner.userprofile', read_only = True)

    class Meta:
        model = FooResponse
        fields = ('id', 'name', 'user')
class Foo(models.Model):
    owner = ForeignKey('auth.User', related_name = 'foos')
    name = models.CharField()

class FooResponse(models.Model):
    owner = ForeignKey('auth.User', related_name = 'responses')
    foo = ForeignKey(Foo, related_name = 'responses')

由于这两个视图和序列化程序返回基本相同的数据(ID字段、名称字段和用户配置文件信息)并使用相同的请求参数(当前用户),因此我想将这两个合并为一个。我该怎么做?最后,我希望序列化的响应包含两个查询集的结果。

因为
序列化程序。在您的情况下,data
将是一个字典列表,所以我会尝试为响应连接两个序列化程序的结果:

class GetFoosAndResponses(generics.ListAPIView):
    # init stuff here

    def list(self, request):
        foo_queryset = Foo.objects.filter(owner=request.user)
        foo_serializer = FooSerializer(foo_queryset, many=True)

        foo_response_queryset = FooResponse.objects.filter(owner=request.user)
        foo_response_serializer = FooResponseSerializer(foo_response_queryset, many=True)

        return Response(foo_serializer.data + foo_response_serializer.data, status=status.HTTP_200_OK)

这有意义吗?:)

我说的对吗?你想创建一个视图,它将返回和Foo以及FooResponse序列化的模型?@Paul不完全正确。我想得到所有
Foo
对象,其中用户是所有者,所有
Foo
对象都存在
FooResponse
对象,其中用户是所有者。哇,Python的简单性从未让我惊讶。这就像一个符咒!