mirror of
https://github.com/graphql-python/graphene-django.git
synced 2025-07-14 02:02:20 +03:00
added know_parent bool field in connectionfield
This commit is contained in:
parent
612eebdd55
commit
3af66f6903
|
@ -6,6 +6,7 @@ from promise import Promise
|
||||||
from neomodel import NodeSet
|
from neomodel import NodeSet
|
||||||
|
|
||||||
from graphene.types import Field, List
|
from graphene.types import Field, List
|
||||||
|
from graphene.types.scalars import Boolean
|
||||||
from graphene.relay import ConnectionField, PageInfo
|
from graphene.relay import ConnectionField, PageInfo
|
||||||
from graphql_relay.connection.arrayconnection import connection_from_list_slice
|
from graphql_relay.connection.arrayconnection import connection_from_list_slice
|
||||||
|
|
||||||
|
@ -39,6 +40,9 @@ class DjangoConnectionField(ConnectionField):
|
||||||
"enforce_first_or_last",
|
"enforce_first_or_last",
|
||||||
graphene_settings.RELAY_CONNECTION_ENFORCE_FIRST_OR_LAST,
|
graphene_settings.RELAY_CONNECTION_ENFORCE_FIRST_OR_LAST,
|
||||||
)
|
)
|
||||||
|
kwargs.setdefault('know_parent', Boolean(default_value=False,
|
||||||
|
description='Know parent type in nodes?'
|
||||||
|
' \n Default = <False>'))
|
||||||
super(DjangoConnectionField, self).__init__(*args, **kwargs)
|
super(DjangoConnectionField, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|
|
@ -43,7 +43,6 @@ class DjangoFilterConnectionField(DjangoConnectionField):
|
||||||
self._filterset_class = get_filterset_class(
|
self._filterset_class = get_filterset_class(
|
||||||
self._provided_filterset_class, **meta
|
self._provided_filterset_class, **meta
|
||||||
)
|
)
|
||||||
|
|
||||||
return self._filterset_class
|
return self._filterset_class
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -116,8 +115,7 @@ class DjangoFilterConnectionField(DjangoConnectionField):
|
||||||
source_class = default_manager.source
|
source_class = default_manager.source
|
||||||
|
|
||||||
def new_resolver(root, info, **args):
|
def new_resolver(root, info, **args):
|
||||||
|
# filters
|
||||||
#filters
|
|
||||||
filters = dict(filter(lambda x: '__' in x[0], args.items()))
|
filters = dict(filter(lambda x: '__' in x[0], args.items()))
|
||||||
qs = resolver(root, info, **args)
|
qs = resolver(root, info, **args)
|
||||||
if qs is None:
|
if qs is None:
|
||||||
|
@ -127,25 +125,29 @@ class DjangoFilterConnectionField(DjangoConnectionField):
|
||||||
base_filters, relationship_filters = make_qs(filters)
|
base_filters, relationship_filters = make_qs(filters)
|
||||||
qs = qs.filter().filter(base_filters)
|
qs = qs.filter().filter(base_filters)
|
||||||
|
|
||||||
|
# has filtering
|
||||||
if relationship_filters:
|
if relationship_filters:
|
||||||
rels = {}
|
rels = {}
|
||||||
|
# check that this field has relationship in model class
|
||||||
for item in relationship_filters.items():
|
for item in relationship_filters.items():
|
||||||
rel_field = getattr(source_class, item[0], None)
|
rel_field = getattr(source_class, item[0], None)
|
||||||
if rel_field is None:
|
if rel_field is None:
|
||||||
raise Exception('This relationship field not found '
|
raise Exception('This relationship field not found '
|
||||||
'in source class')
|
'in source class: {class_}'.format(class_=source_class.__name__))
|
||||||
node_class = rel_field.build_manager(0, item[0]).definition['node_class']
|
# build definition of node_class - source_class( which
|
||||||
rels[item[0]] = node_class.nodes.get(uid=item[1])
|
# must filter by uid - node_class.nodes.get(uid=item[1]))
|
||||||
|
node_class=rel_field.build_manager(0, item[0]).definition['node_class']
|
||||||
|
rels[item[0]]=node_class.nodes.get(uid=item[1])
|
||||||
for item in rels.items():
|
for item in rels.items():
|
||||||
qs = qs.has(**{item[0]: item[1]})
|
qs=qs.has(**{item[0]: item[1]})
|
||||||
|
|
||||||
if order:
|
if order:
|
||||||
qs = qs.order_by(order)
|
qs=qs.order_by(order)
|
||||||
|
|
||||||
# set parent to child fields
|
# set parent to child fields
|
||||||
# in ''_parent'' attribute
|
# in ''_parent'' attribute
|
||||||
if _parent and root is not None:
|
if _parent and root is not None:
|
||||||
instances = []
|
instances=[]
|
||||||
for instance in qs:
|
for instance in qs:
|
||||||
setattr(instance, '_parent', root)
|
setattr(instance, '_parent', root)
|
||||||
instances.append(instance)
|
instances.append(instance)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user