2015-09-08 2 views
0

У меня есть два похожих вида, которые возвращают те же сериализованные ответы. Взгляды, как это:Как объединить два похожих вида в один ответ?

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

Поскольку эти две точки зрения и сериализаторов вернуться по сути, одни и те же данные (поле ИД, поле имени и информация профиля пользователя) и использовать те же параметры запроса (текущий пользователь), я хотел бы объединить эти два в один. Как мне это сделать? В конце концов, я хотел бы, чтобы сериализованный ответ содержал результаты обоих наборов запросов.

+0

Я прав, что вы хотите сделать представление, которое вернет сериализованные модели AND Foo AND FooResponse? – Paul

+0

@Paul Не совсем. Я хочу получить все объекты 'Foo', где пользователь является владельцем и всеми объектами' Foo', где существует объект 'FooResponse', где пользователь является владельцем. – manabreak

ответ

1

С serializer.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) 

ли это смысл? :)

+0

Ничего себе, простота Python никогда меня не удивляет. Это работает как шарм! – manabreak