mirror of
https://github.com/graphql-python/graphene-django.git
synced 2025-02-13 18:10:36 +03:00
Pass context object to FilterSet instance to support request-baed filtering (fixes #203).
This commit is contained in:
parent
cec1a84480
commit
4bdcf054eb
|
@ -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)
|
||||||
|
|
|
@ -73,7 +73,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(
|
||||||
|
|
|
@ -136,6 +136,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