mirror of
				https://github.com/graphql-python/graphene-django.git
				synced 2025-10-31 16:07:36 +03:00 
			
		
		
		
	Merge pull request #232 from basilfx/master
Pass context object to FilterSet for request-baed filtering
This commit is contained in:
		
						commit
						bc59d0ad8e
					
				|  | @ -126,3 +126,23 @@ create your own ``Filterset`` as follows: | ||||||
|         # We specify our custom AnimalFilter using the filterset_class param |         # We specify our custom AnimalFilter using the filterset_class param | ||||||
|         all_animals = DjangoFilterConnectionField(AnimalNode, |         all_animals = DjangoFilterConnectionField(AnimalNode, | ||||||
|                                                   filterset_class=AnimalFilter) |                                                   filterset_class=AnimalFilter) | ||||||
|  | 
 | ||||||
|  | The context argument is passed on as the `request argument <http://django-filter.readthedocs.io/en/latest/guide/usage.html#request-based-filtering>`__ | ||||||
|  | in a ``django_filters.FilterSet`` instance. You can use this to customize your | ||||||
|  | filters to be context-dependent. We could modify the ``AnimalFilter`` above to | ||||||
|  | pre-filter animals owned by the authenticated user (set in ``context.user``). | ||||||
|  | 
 | ||||||
|  | .. code:: python | ||||||
|  | 
 | ||||||
|  |     class AnimalFilter(django_filters.FilterSet): | ||||||
|  |         # Do case-insensitive lookups on 'name' | ||||||
|  |         name = django_filters.CharFilter(lookup_type='iexact') | ||||||
|  | 
 | ||||||
|  |         class Meta: | ||||||
|  |             model = Animal | ||||||
|  |             fields = ['name', 'genus', 'is_domesticated'] | ||||||
|  | 
 | ||||||
|  |         @property | ||||||
|  |         def qs(self): | ||||||
|  |             # The query context can be found in self.request. | ||||||
|  |             return super(AnimalFilter, self).filter(owner=self.request.user) | ||||||
|  |  | ||||||
|  | @ -72,7 +72,8 @@ class DjangoFilterConnectionField(DjangoConnectionField): | ||||||
|         filter_kwargs = {k: v for k, v in args.items() if k in filtering_args} |         filter_kwargs = {k: v for k, v in args.items() if k in filtering_args} | ||||||
|         qs = filterset_class( |         qs = filterset_class( | ||||||
|             data=filter_kwargs, |             data=filter_kwargs, | ||||||
|             queryset=default_manager.get_queryset() |             queryset=default_manager.get_queryset(), | ||||||
|  |             request=context | ||||||
|         ).qs |         ).qs | ||||||
| 
 | 
 | ||||||
|         return super(DjangoFilterConnectionField, cls).connection_resolver( |         return super(DjangoFilterConnectionField, cls).connection_resolver( | ||||||
|  |  | ||||||
|  | @ -140,6 +140,48 @@ def test_filter_shortcut_filterset_extra_meta(): | ||||||
|     assert 'headline' not in field.filterset_class.get_fields() |     assert 'headline' not in field.filterset_class.get_fields() | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | def test_filter_shortcut_filterset_context(): | ||||||
|  |     class ArticleContextFilter(django_filters.FilterSet): | ||||||
|  | 
 | ||||||
|  |         class Meta: | ||||||
|  |             model = Article | ||||||
|  |             exclude = set() | ||||||
|  | 
 | ||||||
|  |         @property | ||||||
|  |         def qs(self): | ||||||
|  |             qs = super(ArticleContextFilter, self).qs | ||||||
|  |             return qs.filter(reporter=self.request.reporter) | ||||||
|  | 
 | ||||||
|  |     class Query(ObjectType): | ||||||
|  |         context_articles = DjangoFilterConnectionField(ArticleNode, filterset_class=ArticleContextFilter) | ||||||
|  | 
 | ||||||
|  |     r1 = Reporter.objects.create(first_name='r1', last_name='r1', email='r1@test.com') | ||||||
|  |     r2 = Reporter.objects.create(first_name='r2', last_name='r2', email='r2@test.com') | ||||||
|  |     Article.objects.create(headline='a1', pub_date=datetime.now(), reporter=r1, editor=r1) | ||||||
|  |     Article.objects.create(headline='a2', pub_date=datetime.now(), reporter=r2, editor=r2) | ||||||
|  | 
 | ||||||
|  |     class context(object): | ||||||
|  |         reporter = r2 | ||||||
|  | 
 | ||||||
|  |     query = ''' | ||||||
|  |     query { | ||||||
|  |         contextArticles { | ||||||
|  |             edges { | ||||||
|  |                 node { | ||||||
|  |                     headline | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     ''' | ||||||
|  |     schema = Schema(query=Query) | ||||||
|  |     result = schema.execute(query, context_value=context()) | ||||||
|  |     assert not result.errors | ||||||
|  | 
 | ||||||
|  |     assert len(result.data['contextArticles']['edges']) == 1 | ||||||
|  |     assert result.data['contextArticles']['edges'][0]['node']['headline'] == 'a2' | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| def test_filter_filterset_information_on_meta(): | def test_filter_filterset_information_on_meta(): | ||||||
|     class ReporterFilterNode(DjangoObjectType): |     class ReporterFilterNode(DjangoObjectType): | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user