Как использовать объект Q (или его функционал) в методе update?

Работаю с API, и в методе POST пытаюсь сделать продление API-ключа через сам API (при наличии разрешения на такие запросы). Хочу сделать, чтобы для этого было необходимо передавать параметр extend, а также один из или оба exp_date и additional_requests для назначения новой даты истечения и дополнительного количества разрешённых запросов соответственно. Так как пользователь может указать их по отдельности, а может вместе, чтобы не долбиться с несколькими ifами, хотел сделать как при запросе:

                if thisKey.allowed_requests - counter > 0 or thisKey.allowed_requests == -1:
                    APIRequest = CreateAPIRequest(
                        APIKey=thisKey,
                        ip=zlib.get_client_ip(request),
                        body=zlib.getRequestBody(request)
                    )
                    APIRequest.save()
                    bans = Bans.objects.filter(
                        Q(user=request.GET['user']) if "user" in request.GET.keys() else Q(),
                        Q(who_banned=request.GET['who_banned']) if "who_banned" in request.GET.keys() else Q(),
                        Q(pass_datetime__gte=datetime.datetime.now(),
                          status="Active") if "active" in request.GET.keys() else Q()
                    )
                    serializer = BansSerializer(bans, many=True)
                    response = serializer.data
                    return Response({"Bans": response if bans else None})

но получил ошибку, так как update() не работает с объектом Q:

                    if "extend" in request.data:
                        if "key" not in request.data:
                            return Response("449 Retry With: 'key'")
                        else:
                            if not ("exp_date" in request.data or "additional_requests" in request.data):
                                return Response("449 Retry With: 'exp_date' or 'additional_requests'")
                            else:
                                key = APIKey.objects.filter(key=request.data.get('key'))
                                if key:
                                    key.update(
                                        Q(
                                            Q(exp_date=request.data.get('exp_date'))
                                            if "exp_date" in request.data else Q(),
                                            Q(allowed_requests=(key.first().allowed_requests + request.data.get('additional_requests')))
                                            if "additional_requests" in request.data else Q()
                                        )
                                    )
                                    return Response({
                                        "success": "APIKey '{}' updated successfully. Its new {} uses and new expiration date is  {}".format(
                                            key.first().key,
                                            key.first().allowed_requests + request.data.get(
                                                'additional_requests') if "additional_requests" in request.data else key.first().allowed_requests,
                                            request.data.get(
                                                'exp_date') if "additional_requests" in request.data else key.first().allowed_requests
                                        )})
                                else:
                                    return Response("404 Not Found")

Соответственно, вопрос: как подружить Q и update, либо реализовать тот же функционал по-другому, но без лишних if-ов, или это невозможно и придётся всё-таки использовать их?

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