Skip to content

Commit 4cc4673

Browse files
committed
Simplified DjangoFilterConnectionField logic
1 parent acff3d5 commit 4cc4673

File tree

2 files changed

+22
-44
lines changed

2 files changed

+22
-44
lines changed

graphene_django/fields.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,13 @@ def __init__(self, *args, **kwargs):
3232
self.on = kwargs.pop('on', False)
3333
super(DjangoConnectionField, self).__init__(*args, **kwargs)
3434

35+
@property
36+
def node_type(self):
37+
return self.type._meta.node
38+
3539
@property
3640
def model(self):
37-
return self.type._meta.node._meta.model
41+
return self.node_type._meta.model
3842

3943
def get_manager(self):
4044
if self.on:

graphene_django/filter/fields.py

Lines changed: 17 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
import inspect
2-
31
from collections import OrderedDict
42
from functools import partial
53

4+
# from graphene.relay import is_node
65
from graphene.types.argument import to_arguments
76
from ..fields import DjangoConnectionField
8-
from graphene.relay import is_node
97
from .utils import get_filtering_args_from_filterset, get_filterset_class
108

119

@@ -15,47 +13,12 @@ def __init__(self, type, fields=None, order_by=None,
1513
extra_filter_meta=None, filterset_class=None,
1614
*args, **kwargs):
1715
self._fields = fields
18-
self._type = type
19-
self._filterset_class = filterset_class
16+
self._provided_filterset_class = filterset_class
17+
self._filterset_class = None
2018
self._extra_filter_meta = extra_filter_meta
2119
self._base_args = None
2220
super(DjangoFilterConnectionField, self).__init__(type, *args, **kwargs)
2321

24-
@property
25-
def node_type(self):
26-
if inspect.isfunction(self._type) or inspect.ismethod(self._type):
27-
return self._type()
28-
return self._type
29-
30-
@property
31-
def meta(self):
32-
if is_node(self.node_type):
33-
_model = self.node_type._meta.model
34-
else:
35-
# ConnectionFields can also be passed Connections,
36-
# in which case, we need to use the Node of the connection
37-
# to get our relevant args.
38-
_model = self.node_type._meta.node._meta.model
39-
40-
meta = dict(model=_model,
41-
fields=self.fields)
42-
if self._extra_filter_meta:
43-
meta.update(self._extra_filter_meta)
44-
return meta
45-
46-
@property
47-
def fields(self):
48-
if self._fields:
49-
return self._fields
50-
51-
if is_node(self.node_type):
52-
return self.node_type._meta.filter_fields
53-
else:
54-
# ConnectionFields can also be passed Connections,
55-
# in which case, we need to use the Node of the connection
56-
# to get our relevant args.
57-
return self.node_type._meta.node._meta.filter_fields
58-
5922
@property
6023
def args(self):
6124
return to_arguments(self._base_args or OrderedDict(), self.filtering_args)
@@ -66,7 +29,16 @@ def args(self, args):
6629

6730
@property
6831
def filterset_class(self):
69-
return get_filterset_class(self._filterset_class, **self.meta)
32+
if not self._filterset_class:
33+
fields = self._fields or self.node_type._meta.filter_fields
34+
meta = dict(model=self.model,
35+
fields=fields)
36+
if self._extra_filter_meta:
37+
meta.update(self._extra_filter_meta)
38+
39+
self._filterset_class = get_filterset_class(self._provided_filterset_class, **meta)
40+
41+
return self._filterset_class
7042

7143
@property
7244
def filtering_args(self):
@@ -76,8 +48,10 @@ def filtering_args(self):
7648
def connection_resolver(resolver, connection, default_manager, filterset_class, filtering_args,
7749
root, args, context, info):
7850
filter_kwargs = {k: v for k, v in args.items() if k in filtering_args}
79-
qs = default_manager.get_queryset()
80-
qs = filterset_class(data=filter_kwargs, queryset=qs).qs
51+
qs = filterset_class(
52+
data=filter_kwargs,
53+
queryset=default_manager.get_queryset()
54+
).qs
8155
return DjangoConnectionField.connection_resolver(resolver, connection, qs, root, args, context, info)
8256

8357
def get_resolver(self, parent_resolver):

0 commit comments

Comments
 (0)