Skip to content

Commit b0a0418

Browse files
author
Daan van der Kallen
committed
Make id filter work for combined endpoint
1 parent 3388534 commit b0a0418

File tree

1 file changed

+29
-6
lines changed

1 file changed

+29
-6
lines changed

binder/plugins/views/combined.py

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ def combined_view(request, router, names):
7575

7676
# Get filtered & annotated querysets per name
7777
querysets = {}
78-
for name in names:
78+
for i, name in enumerate(names):
7979
view = views[name]
8080

8181
queryset = view.get_queryset(request)
@@ -92,11 +92,34 @@ def combined_view(request, router, names):
9292
queryset = annotate(queryset, request, sub_include_annotations.get(''))
9393

9494
# filters
95-
filters = {
96-
'id' if k == f'.{name}' else k[len(name) + 2:]: v
97-
for k, v in request.GET.lists()
98-
if k == f'.{name}' or k.startswith(f'.{name}.')
99-
}
95+
filters = {}
96+
for k, v in request.GET.lists():
97+
if k == '.id' or k.startswith('.id:'):
98+
values = []
99+
for value in v.split(','):
100+
try:
101+
value = int(value)
102+
except ValueError:
103+
# leave invalid values for the detailed view
104+
values.append(value)
105+
continue
106+
if value % len(names) == i:
107+
# this is a combined id that matches this view, so we
108+
# can convert it to an id for the model itself
109+
value = value // len(names)
110+
else:
111+
# this id does not match this view, so we convert it to
112+
# an id that never matches any model
113+
value = -1
114+
values.append(str(value))
115+
filters[k[1:]] = ','.join(values)
116+
117+
elif k == f'.{name}' or k.startswith(f'.{name}:'):
118+
filters['id' + k[len(name) + 1:]] = v
119+
120+
elif k.startswith(f'.{name}.'):
121+
filters[k[len(name) + 2:]] = v
122+
100123
for field, values in filters.items():
101124
for v in values:
102125
q, distinct = view._parse_filter(field, v, request, sub_include_annotations)

0 commit comments

Comments
 (0)