Несколько моделей в наборе 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)