Несколько моделей в наборе queryset и/или несколько сериализаторов для одного View?

Допустим, у меня есть модель Foo и модель Bar:

# models.py
class Foo(models.Model):
    foo_title = CharField()
   
class Bar(models.Model):
    bar_title = CharField()


# serializers.py
class FooSerializer(serializers.ModelSerializer):

    class Meta:
        model = Foo
        fields = ["foo_title"]

class BarSerializer(serializers.ModelSerializer):
    foo = FooSerializer()

    class Meta:
        model = Bar
        fields = ["bar_title"]

Если я хочу вернуть модель Foo и модель Bar, я должен установить и вызвать два представления:

# urls.py
path("foo/<pk>/", FooView.as_view())
path("bar/<pk>/", BarView.as_view())

# views.py
class FooView(generics.RetrieveAPIView):
    serializer_class = FooSerializer
    lookup_field = pk

class BarView(generics.RetrieveAPIView):
    serializer_class = BarSerializer
    lookup_field = pk

А затем объединить два результата данных на моем внешнем интерфейсе.

Возможно ли создать один View, который имеет несколько моделей в кверисете и/или несколько сериализаторов? Как я могу сделать только один вызов к бэкенду API, чтобы вернуть данные разных сериализаторов с разными моделями?

например, что-то вроде

# urls.py
path("foobar/<foo_pk>/<bar_pk>", FoobarView.as_view())

# views.py
class FoobarView(generics.ListAPIView):
    pass

Вы можете использовать https://github.com/alanjds/drf-nested-routers

pip install drf-nested-routers

Вот пример использования: https://github.com/alanjds/drf-nested-routers#infinite-depth-nesting

Я могу сделать это с помощью APIView:

# urls.py
path("foobar/<foo_pk>/<bar_pk>", FoobarView.as_view())

# views.py
class FoobarView(APIView):
    def get(self, request, foo_pk, bar_pk):
        foo = FooSerializer(Foo.objects.get(pk=foo_pk)).data
        bar = BarSerializer(Bar.objects.get(pk=bar_pk)).data
        return Response([foo, bar], status=status.HTTP_200_OK)
Вернуться на верх