/
queries.py
57 lines (41 loc) · 1.9 KB
/
queries.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
"""Mixins for helping with lookups from HTTP GET query strings."""
from django.db.models import Q
class APIQueryUtilsMixin(object):
"""Adds useful functions to a WebAPIResource for database lookups."""
def build_queries_for_int_field(self, request, field_name,
query_param_name=None):
"""Build queries based on request parameters for an int field.
:py:meth:`get_queryset` implementations can use this to allow callers
to filter results through range matches. Callers can search for exact
matches, or can make use of the following operations:
* ``<`` (:samp:`?{name}-lt={value}`)
* ``<=`` (:samp:`?{name}-lte={value}`)
* ``>`` (:samp:`?{name}-gt={value}`)
* ``>=`` (:samp:`?{name}-gte={value}`)
Args:
request (django.http.HttpRequest):
The HTTP request from the client.
field_name (unicode):
The field name in the database to query against.
query_param_name (unicode):
The query argument passed to the URL. Defaults to the
``field_name``.
Returns:
django.db.models.Q:
A query expression that can be used in database queries.
"""
if not query_param_name:
query_param_name = field_name.replace('_', '-')
q = Q()
if query_param_name in request.GET:
q = q & Q(**{field_name: request.GET[query_param_name]})
for op in ('gt', 'gte', 'lt', 'lte'):
param = '%s-%s' % (query_param_name, op)
if param in request.GET:
query_field = '%s__%s' % (field_name, op)
try:
q = q & Q(**{query_field: int(request.GET[param])})
except ValueError:
# Not a valid query, so ignore it.
pass
return q