Как можно структурировать Django REST API для множества похожих онлайн-игр?

Я очень новичок в Django и Django REST Framework и хочу реализовать API для 4 относительно похожих игр. Самая базовая игра состоит из того, что игрок наклеивает ярлык на изображение и получает за это очки, если он вводит те же ярлыки, что и его коллега по игре для того же изображения. Одна игровая сессия состоит из 3 раундов.

На данный момент я создал представление для типа игры, игровой сессии, раунда игры, изображения, которое будет показано, и меток, которые будут разделены на метки (пользователь использовал эту метку в качестве ввода) и метки (более одного пользователя ввели эту метку для одной и той же картинки).

Все эти представления выглядят аналогично представлениям Gametype и Tagging, представленным ниже.

    """
    API View that handles retrieving the correct type of a game
    """
    serializer_class = GametypeSerializer

    def get_queryset(self):
        gametypes = Gametype.objects.all().order_by("name")
        return gametypes

    def get(self, request, *args, **kwargs):
        gametype = self.get_queryset()
        serializer = GametypeSerializer(gametype, many=True)
        return Response(serializer.data)

class Tagging(APIView):
    """
    API View to do everything to do with taggings
    """
    serializer_class = TaggingSerializer

    def get_queryset(self):
        taggings = Tagging.objects.all().filter(resource=8225)
        return taggings

    def get(self, request, *args, **kwargs):
        tagging = self.get_queryset()
        serializer = TaggingSerializer(tagging, many=True)
        return Response(serializer.data)

    def post(self, request, *args, **kwargs):
        tagging = request.data.get_queryset()

        serializer = TaggingSerializer(data=tagging)
        if serializer.is_valid(raise_exception=True):
            saved_tagging = serializer.save()
        return Response(saved_tagging)

Представления Tag Tagging и Gamesession также будут нуждаться в POST-запросах (я все еще работаю над ними). Я также делаю только бэкенд для этого веб-приложения, поэтому я могу протестировать все это только с помощью графического интерфейса, который я написал на Python (с помощью tkinter). Меня мучает вопрос: как связать представления друг с другом, чтобы логика игры работала правильно? Или я должен написать одно представление для каждой игры и написать для этого отдельный сериализованный файл? Лучше сказать - как мне сделать бэкенд игры функциональным с этими представлениями? Что я упускаю?

Если бы я делал это, то реализовал бы следующим образом

def check_the_player_token(token):
    # check logic here ...
    if valid_user:
        return True, user_token
    else:
        return False, ''


class Tagging(viewsets.ViewSet):
    # post requests
    def create(self, request):
        # check the player of the token
        success, user = check_the_player_token(token)
        # check if the player is in this game
        # check if round is <= 3
        # check the lable of the other player in database or if the label of other player wasn't added yet pass
        # get this player label and send to serializer
        serializer = TaggingLabelSerializer(data=request.data)
        if serializer.is_valid():
            # save into database
            serializer.save()
            # update the current round
            # check if the label is right or wrong
            # return the response
        else:
            # return a error

Тег viewset, или в вашем случае APIView, получит запрос на пост и будет использовать функции типа check_the_player_token для выполнения необходимых действий

Вернуться на верх