Как использовать объект 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-ов, или это невозможно и придётся всё-таки использовать их?