Может ли APIView группировать несколько методов GET и POST?
Я реализую API для игры, используя DRF представления (точнее APIViews). Я понял, как использовать более одного сериализатора для представления, но мне нужно, чтобы это представление объединяло несколько моделей, и я думаю, что мне нужно более одного метода GET, а также более одного метода POST. Возможно ли это вообще? Пока что мой код выглядит следующим образом:
class GameView(APIView):
"""
API View that retrieves the game, allows users to post stuff and finally a game session is posted as well once the 5 game rounds have been completed
"""
serializer_class = GametypeSerializer
serializer_class = GamesessionSerializer
serializer_class = GameroundSerializer
serializer_class = ResourceSerializer
serializer_class = VerifiedLabelSerializer
serializer_class = LabelSerializer
def get_serializer_class(self):
if self.request.method == 'POST':
return YOUR_SERIALIZER_1
elif self.request.method == 'GET':
return YOUR_SERIALIZER_2
else:
return YOUR_DEFAULT_SERIALIZER
def get_queryset(self):
gametypes = Gametype.objects.all().filter(name="labeler")
return gametypes
def get(self, request, *args, **kwargs):
# gets a resource and an empty game round object to be completed (according to the game type chosen by the user)
def post(self, request, *args, **kwargs):
# users post a label, that is saved in the label model, a verified model is saved in the verified label model. Once 2 game rounds have been completed, a game session is posted.
Думаю, стоит упомянуть, что я планирую использовать один url для этого. Это должно работать так: пользователь нажимает на тип игры, затем вызывается это представление, начинается игра и обрабатывается все, что должно быть обработано во время игры.
Если вы действительно хотите использовать только один url, вы можете сделать это с помощью параметров GET.
def get(self, request, *args, **kwargs):
model = request.GET.get("model")
if model == "Gametype":
.. do something with the Gametype model ..
elif model == "Resource":
.. do something with the Resource model ..
то же самое для get_serializer_class()
, чтобы вы знали, какой сериализатор использовать.
Тогда вы вызовете /gameview/?model=Gametype
или /gameview/?model=Resource
Но что плохого в использовании нескольких адресов?