@@ -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