@@ -107,8 +107,6 @@ def get_filterset_class(self, view, queryset=None):
107107 filterset_class = getattr (view , 'filterset_class' , None )
108108 filterset_fields_overwrite = getattr (view , 'filterset_fields_overwrite' , {})
109109
110- # full text search
111-
112110 if filterset_class :
113111 filterset_model = filterset_class ._meta .model # noqa
114112
@@ -131,42 +129,52 @@ def get_filterset_class(self, view, queryset=None):
131129 overwrite_fields = {k : v for k , v in filterset_fields_overwrite .items () if isinstance (v , Filter )}
132130 overwrite_kwargs = {k : v for k , v in filterset_fields_overwrite .items () if isinstance (v , dict )}
133131
134- for filter_name , field in serializer .fields .items ():
135- if (
136- getattr (field , "write_only" , False )
137- or field .source == "*"
138- or isinstance (field , serializers .BaseSerializer )
139- ):
140- continue
132+ def filters_from_serializer (_serializer , field_name_prefix = '' , filter_name_prefix = '' ):
133+ if isinstance (_serializer , serializers .ListSerializer ):
134+ _serializer = _serializer .child
141135
142- field_name = field .source .replace ("." , "__" ) or filter_name
143- if get_model_field (filterset_model , field_name ) is None and (
144- queryset is not None and filter_name not in queryset .query .annotations
145- ):
146- continue
136+ for filter_name , field in _serializer .fields .items ():
137+ if getattr (field , "write_only" , False ) or field .source == "*" :
138+ continue
147139
148- try :
149- filter_spec = FILTER_FOR_SERIALIZER_FIELD_DEFAULTS [field ]
150- except KeyError :
151- warnings .warn (f"{ filter_name } 字段未找到过滤器, 跳过自动成filter!" )
152- continue
140+ field_name = field .source .replace ("." , "__" ) or filter_name
141+ if field_name_prefix :
142+ field_name = field_name_prefix + "__" + field_name
143+
144+ if filter_name_prefix :
145+ filter_name = filter_name_prefix + "." + filter_name
146+
147+ if get_model_field (filterset_model , field_name ) is None and (
148+ queryset is not None and filter_name not in queryset .query .annotations
149+ ):
150+ continue
153151
154- extra = filter_spec .get ("extra" )
155- kwargs = {"field_name" : field_name , "label" : field .label , "help_text" : field .help_text }
156- if callable (extra ):
157- kwargs .update (extra (field ))
152+ if isinstance (field , serializers .BaseSerializer ):
153+ filters_from_serializer (field , field_name_prefix = field_name , filter_name_prefix = filter_name )
158154
159- if "queryset" in kwargs and kwargs ["queryset" ] is None :
160- warnings .warn (f"{ filter_name } 字段未提供queryset, 跳过自动成filter!" )
161- continue
155+ try :
156+ filter_spec = FILTER_FOR_SERIALIZER_FIELD_DEFAULTS [field ]
157+ except KeyError :
158+ warnings .warn (f"{ filter_name } 字段未找到过滤器, 跳过自动成filter!" )
159+ continue
162160
163- overwrite_value = overwrite_kwargs .get (filter_name )
164- if overwrite_value :
165- kwargs .update (overwrite_value )
161+ extra = filter_spec .get ("extra" )
162+ kwargs = {"field_name" : field_name , "label" : field .label , "help_text" : field .help_text }
163+ if callable (extra ):
164+ kwargs .update (extra (field ))
166165
167- filterset_field = filter_spec ["filter_class" ](** kwargs )
168- filterset_fields [filter_name ] = filterset_field
166+ if "queryset" in kwargs and kwargs ["queryset" ] is None :
167+ warnings .warn (f"{ filter_name } 字段未提供queryset, 跳过自动成filter!" )
168+ continue
169169
170+ overwrite_value = overwrite_kwargs .get (filter_name )
171+ if overwrite_value :
172+ kwargs .update (overwrite_value )
173+
174+ filterset_field = filter_spec ["filter_class" ](** kwargs )
175+ filterset_fields [filter_name ] = filterset_field
176+
177+ filters_from_serializer (serializer )
170178 filterset_fields .update (overwrite_fields )
171179
172180 AutoFilterSet = type ("AutoFilterSet" , (self .filterset_base ,), filterset_fields ) # noqa
@@ -252,6 +260,7 @@ class FullTextSearchFilter(SearchFilter):
252260 """
253261 Search filter that supports fulltext search
254262 """
263+
255264 search_vector = None
256265 search_query = None
257266
0 commit comments