Как добавить данные двух разных сериализаторов для передачи в качестве ссылки в Django Rest Framework - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть две модели A и B, которые не связаны друг с другом.Я хочу сериализовать эти две модели и отправить их как один объект запроса, предположительно, как показано ниже:

{
    'A': {},
    'B': {}
}

У меня есть отдельные сериализаторы для A и B

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Вы можете использовать DjangoMultiModelApi libraray , в этой библиотеке вы можете комбинировать несколько данных модели с нумерацией страниц.

, и второе решение:

def get(self, request, *args, **kwargs):
    a_serialzer_data = serializer_classA(query_setA, many=True)
    b_serialzer_data = serializer_classB(query_setB, many=True)
    return Response({
        "A": a_serialzer_data.data,
        "B": b_serialzer_data.data
    })
0 голосов
/ 24 февраля 2019

Из Документация Django Rest Framework по сериализаторам :

Класс Serializer сам по себе является типом поля и может использоваться для представления отношений, в которые вложен один тип объекта.другой.

Таким образом, вы можете просто создать класс сериализатора с полями "A" и "B" следующим образом:

from rest_framework import serializers

class ABSerializer(serializers.Serializer):
    A = ASerializer()
    B = BSerializer()

и использовать его следующим образом:

from rest_framework.generics import RetrieveAPIView

class ABView(RetrieveAPIView):
    serializer_class = ABSerializer

    def get_object(self):
        return {'a': self.get_object_a(), 'b': self.get_object_b()}
0 голосов
/ 22 февраля 2019

Пожалуйста, посмотрите.Я переопределяю метод get.Здесь a_obj, b_obj - это объект python, который может быть получен из базы данных.

from rest_framework.generics import ListAPIView, RetrieveAPIView
from rest_framework.response import Response
class TwoSerializedModelAPIView(RetrieveAPIView):
    def get(self, request, *args, **kwargs):
        a_obj = A.objects.get(id=1)
        b_obj = B.objects.get(id=1)
        data = {'A': ASerializer(a_obj).data, 'B': BSerializer(b_obj).data}
        return Response(data=data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...