@@ -1668,64 +1668,42 @@ def _get_filtered_queryset_base(self, request, pk=None, include_annotations=None
16681668
16691669 return queryset , annotations
16701670
1671- def get_filtered_queryset (self , request , pk = None , include_annotations = None ):
1671+ def get_filtered_queryset (self , request , * args , ** kwargs ):
16721672 """
16731673 Returns a scoped queryset with filtering and sorting applied as
16741674 specified by the request.
16751675 """
1676- queryset = self .get_queryset (request )
1677- if pk :
1678- queryset = queryset .filter (pk = int (pk ))
1679-
1680- # No parameter repetition. Should be extended to .params too after filters have been refactored.
1681- for k , v in request .GET .lists ():
1682- if not k .startswith ('.' ) and len (v ) > 1 :
1683- raise BinderRequestError ('Query parameter `{}` may not be repeated.' .format (k ))
1684-
1685- #### soft-deletes
1686- queryset = self .filter_deleted (queryset , pk , request .GET .get ('deleted' ), request )
1687-
1688- #### annotations
1689- if include_annotations is None :
1690- include_annotations = self ._parse_include_annotations (request )
1691-
1692- queryset = annotate (queryset , request , include_annotations .get ('' ))
1693-
1694- #### filters
1695- filters = {k .lstrip ('.' ): v for k , v in request .GET .lists () if k .startswith ('.' )}
1696- for field , values in filters .items ():
1697- for v in values :
1698- q , distinct = self ._parse_filter (field , v , request , include_annotations )
1699- queryset = queryset .filter (q )
1700- if distinct :
1701- queryset = queryset .distinct ()
1702-
1703- #### search
1704- if 'search' in request .GET :
1705- queryset = self .search (queryset , request .GET ['search' ], request )
1706-
1676+ queryset , annotations = self ._get_filtered_queryset_base (request , * args , ** kwargs )
1677+ queryset = queryset .annotate (** annotations )
17071678 queryset = self .order_by (queryset , request )
1708-
17091679 return queryset
17101680
1711-
17121681 def get (self , request , pk = None , withs = None , include_annotations = None ):
17131682 include_meta = request .GET .get ('include_meta' , 'total_records' ).split (',' )
17141683 if include_annotations is None :
17151684 include_annotations = self ._parse_include_annotations (request )
17161685
1717- queryset = self .get_filtered_queryset (request , pk , include_annotations )
1686+ queryset , annotations = self ._get_filtered_queryset_base (request , pk , include_annotations )
17181687
17191688 meta = self ._generate_meta (include_meta , queryset , request , pk )
17201689
1690+ queryset = self ._order_by_base (queryset , request , annotations )
17211691 queryset = self ._paginate (queryset , request )
17221692
1723- #### with
1724- # parse wheres from request
1725- data = self ._get_objs (queryset , request = request , annotations = include_annotations .get ('' ))
1693+ # We fetch the data with only the currently applied annotations
1694+ data = self ._get_objs (
1695+ queryset ,
1696+ request = request ,
1697+ annotations = include_annotations .get ('' ),
1698+ to_annotate = annotations ,
1699+ )
17261700
1727- pks = [obj ['id' ] for obj in data ]
1701+ # Now we add all remaining annotations to this data
1702+ data_by_pk = {obj ['id' ]: obj for obj in data }
1703+ pks = set (data_by_pk )
17281704
1705+ #### with
1706+ # parse wheres from request
17291707 extras , extras_mapping , extras_reverse_mapping , field_results = self ._get_withs (pks , withs , request = request , include_annotations = include_annotations )
17301708
17311709 for obj in data :
@@ -1741,7 +1719,7 @@ def get(self, request, pk=None, withs=None, include_annotations=None):
17411719 meta ['comment' ] = self .comment
17421720
17431721 debug = {'request_id' : request .request_id }
1744- if django . conf . settings .DEBUG and 'debug' in request .GET :
1722+ if settings .DEBUG and 'debug' in request .GET :
17451723 debug ['queries' ] = ['{}s: {}' .format (q ['time' ], q ['sql' ].replace ('"' , '' )) for q in django .db .connection .queries ]
17461724 debug ['query_count' ] = len (django .db .connection .queries )
17471725
0 commit comments