mirror of
https://github.com/graphql-python/graphene-django.git
synced 2025-06-15 02:53:11 +03:00
Simplified DjangoFilterConnectionField logic
This commit is contained in:
parent
acff3d59db
commit
4cc46736bf
|
@ -32,9 +32,13 @@ class DjangoConnectionField(ConnectionField):
|
||||||
self.on = kwargs.pop('on', False)
|
self.on = kwargs.pop('on', False)
|
||||||
super(DjangoConnectionField, self).__init__(*args, **kwargs)
|
super(DjangoConnectionField, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def node_type(self):
|
||||||
|
return self.type._meta.node
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def model(self):
|
def model(self):
|
||||||
return self.type._meta.node._meta.model
|
return self.node_type._meta.model
|
||||||
|
|
||||||
def get_manager(self):
|
def get_manager(self):
|
||||||
if self.on:
|
if self.on:
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
import inspect
|
|
||||||
|
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
from functools import partial
|
from functools import partial
|
||||||
|
|
||||||
|
# from graphene.relay import is_node
|
||||||
from graphene.types.argument import to_arguments
|
from graphene.types.argument import to_arguments
|
||||||
from ..fields import DjangoConnectionField
|
from ..fields import DjangoConnectionField
|
||||||
from graphene.relay import is_node
|
|
||||||
from .utils import get_filtering_args_from_filterset, get_filterset_class
|
from .utils import get_filtering_args_from_filterset, get_filterset_class
|
||||||
|
|
||||||
|
|
||||||
|
@ -15,47 +13,12 @@ class DjangoFilterConnectionField(DjangoConnectionField):
|
||||||
extra_filter_meta=None, filterset_class=None,
|
extra_filter_meta=None, filterset_class=None,
|
||||||
*args, **kwargs):
|
*args, **kwargs):
|
||||||
self._fields = fields
|
self._fields = fields
|
||||||
self._type = type
|
self._provided_filterset_class = filterset_class
|
||||||
self._filterset_class = filterset_class
|
self._filterset_class = None
|
||||||
self._extra_filter_meta = extra_filter_meta
|
self._extra_filter_meta = extra_filter_meta
|
||||||
self._base_args = None
|
self._base_args = None
|
||||||
super(DjangoFilterConnectionField, self).__init__(type, *args, **kwargs)
|
super(DjangoFilterConnectionField, self).__init__(type, *args, **kwargs)
|
||||||
|
|
||||||
@property
|
|
||||||
def node_type(self):
|
|
||||||
if inspect.isfunction(self._type) or inspect.ismethod(self._type):
|
|
||||||
return self._type()
|
|
||||||
return self._type
|
|
||||||
|
|
||||||
@property
|
|
||||||
def meta(self):
|
|
||||||
if is_node(self.node_type):
|
|
||||||
_model = self.node_type._meta.model
|
|
||||||
else:
|
|
||||||
# ConnectionFields can also be passed Connections,
|
|
||||||
# in which case, we need to use the Node of the connection
|
|
||||||
# to get our relevant args.
|
|
||||||
_model = self.node_type._meta.node._meta.model
|
|
||||||
|
|
||||||
meta = dict(model=_model,
|
|
||||||
fields=self.fields)
|
|
||||||
if self._extra_filter_meta:
|
|
||||||
meta.update(self._extra_filter_meta)
|
|
||||||
return meta
|
|
||||||
|
|
||||||
@property
|
|
||||||
def fields(self):
|
|
||||||
if self._fields:
|
|
||||||
return self._fields
|
|
||||||
|
|
||||||
if is_node(self.node_type):
|
|
||||||
return self.node_type._meta.filter_fields
|
|
||||||
else:
|
|
||||||
# ConnectionFields can also be passed Connections,
|
|
||||||
# in which case, we need to use the Node of the connection
|
|
||||||
# to get our relevant args.
|
|
||||||
return self.node_type._meta.node._meta.filter_fields
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def args(self):
|
def args(self):
|
||||||
return to_arguments(self._base_args or OrderedDict(), self.filtering_args)
|
return to_arguments(self._base_args or OrderedDict(), self.filtering_args)
|
||||||
|
@ -66,7 +29,16 @@ class DjangoFilterConnectionField(DjangoConnectionField):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def filterset_class(self):
|
def filterset_class(self):
|
||||||
return get_filterset_class(self._filterset_class, **self.meta)
|
if not self._filterset_class:
|
||||||
|
fields = self._fields or self.node_type._meta.filter_fields
|
||||||
|
meta = dict(model=self.model,
|
||||||
|
fields=fields)
|
||||||
|
if self._extra_filter_meta:
|
||||||
|
meta.update(self._extra_filter_meta)
|
||||||
|
|
||||||
|
self._filterset_class = get_filterset_class(self._provided_filterset_class, **meta)
|
||||||
|
|
||||||
|
return self._filterset_class
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def filtering_args(self):
|
def filtering_args(self):
|
||||||
|
@ -76,8 +48,10 @@ class DjangoFilterConnectionField(DjangoConnectionField):
|
||||||
def connection_resolver(resolver, connection, default_manager, filterset_class, filtering_args,
|
def connection_resolver(resolver, connection, default_manager, filterset_class, filtering_args,
|
||||||
root, args, context, info):
|
root, args, context, info):
|
||||||
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 = default_manager.get_queryset()
|
qs = filterset_class(
|
||||||
qs = filterset_class(data=filter_kwargs, queryset=qs).qs
|
data=filter_kwargs,
|
||||||
|
queryset=default_manager.get_queryset()
|
||||||
|
).qs
|
||||||
return DjangoConnectionField.connection_resolver(resolver, connection, qs, root, args, context, info)
|
return DjangoConnectionField.connection_resolver(resolver, connection, qs, root, args, context, info)
|
||||||
|
|
||||||
def get_resolver(self, parent_resolver):
|
def get_resolver(self, parent_resolver):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user