Skip to content

Commit 3e5ae5a

Browse files
committed
don’t try to access the type until after initialization
this allows for fields in a node (using a DjangoFilterConnectionField) that reference themselves
1 parent d348ec8 commit 3e5ae5a

File tree

1 file changed

+45
-10
lines changed

1 file changed

+45
-10
lines changed

graphene_django/filter/fields.py

Lines changed: 45 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
from collections import OrderedDict
12
from functools import partial
23

4+
from graphene.types.argument import to_arguments
35
from ..fields import DjangoConnectionField
46
from .utils import get_filtering_args_from_filterset, get_filterset_class
57

@@ -9,19 +11,52 @@ class DjangoFilterConnectionField(DjangoConnectionField):
911
def __init__(self, type, fields=None, order_by=None,
1012
extra_filter_meta=None, filterset_class=None,
1113
*args, **kwargs):
14+
self._order_by = order_by
15+
self._fields = fields
16+
self._type = type
17+
self._filterset_class = filterset_class
18+
self._extra_filter_meta = extra_filter_meta
19+
self._base_args = None
20+
super(DjangoFilterConnectionField, self).__init__(type, *args, **kwargs)
21+
22+
@property
23+
def node_type(self):
24+
if callable(self._type):
25+
return self._type()
26+
return self._type
27+
28+
@property
29+
def order_by(self):
30+
return self._order_by or self.node_type._meta.filter_order_by
1231

13-
self.order_by = order_by or type._meta.filter_order_by
14-
self.fields = fields or type._meta.filter_fields
15-
meta = dict(model=type._meta.model,
32+
@property
33+
def meta(self):
34+
meta = dict(model=self.node_type._meta.model,
1635
fields=self.fields,
1736
order_by=self.order_by)
18-
if extra_filter_meta:
19-
meta.update(extra_filter_meta)
20-
self.filterset_class = get_filterset_class(filterset_class, **meta)
21-
self.filtering_args = get_filtering_args_from_filterset(self.filterset_class, type)
22-
kwargs.setdefault('args', {})
23-
kwargs['args'].update(self.filtering_args)
24-
super(DjangoFilterConnectionField, self).__init__(type, *args, **kwargs)
37+
if self._extra_filter_meta:
38+
meta.update(self.extra_filter_meta)
39+
return meta
40+
41+
@property
42+
def fields(self):
43+
return self._fields or self.node_type._meta.filter_fields
44+
45+
@property
46+
def args(self):
47+
return to_arguments(self._base_args or OrderedDict(), self.filtering_args)
48+
49+
@args.setter
50+
def args(self, args):
51+
self._base_args = args
52+
53+
@property
54+
def filterset_class(self):
55+
return get_filterset_class(self._filterset_class, **self.meta)
56+
57+
@property
58+
def filtering_args(self):
59+
return get_filtering_args_from_filterset(self.filterset_class, self.node_type)
2560

2661
@staticmethod
2762
def connection_resolver(resolver, connection, default_manager, filterset_class, filtering_args,

0 commit comments

Comments
 (0)