def extend_schema_type_filter(schema_type, model): """Extend schema_type object to be able to filter on multiple levels of a query Args: schema_type (DjangoObjectType): GraphQL Object type for a given model model (Model): Django model Returns: schema_type (DjangoObjectType) """ for field in model._meta.get_fields(): # Check attribute is a ManyToOne field # OneToOneRel is a subclass of ManyToOneRel, but we don't want to treat is as a list if not isinstance(field, ManyToOneRel) or isinstance( field, OneToOneRel): continue child_schema_type = registry["graphql_types"].get( field.related_model._meta.label_lower) if child_schema_type: resolver_name = f"resolve_{field.name}" search_params = generate_list_search_parameters(child_schema_type) # Add OneToMany field to schema_type schema_type._meta.fields[field.name] = graphene.Field.mounted( graphene.List(child_schema_type, **search_params)) # Add resolve function to schema_type setattr( schema_type, resolver_name, generate_filter_resolver(child_schema_type, resolver_name, field.name)) return schema_type
def test_search_parameters(self): fields = SiteFilterSet.get_filters().keys() params = generate_list_search_parameters(self.schema) exclude_filters = ["type"] for field in fields: if field not in exclude_filters: self.assertIn(field, params.keys()) else: self.assertNotIn(field, params.keys())