mirror of
https://github.com/graphql-python/graphene-django.git
synced 2025-07-13 17:52:19 +03:00
Add feature to processor to generate based on related_models
This commit is contained in:
parent
1836b8b4c2
commit
8692c82266
|
@ -4,7 +4,7 @@ from collections import OrderedDict
|
||||||
from elasticsearch_dsl import Q
|
from elasticsearch_dsl import Q
|
||||||
from graphene import Enum, InputObjectType, Field, Int, Float
|
from graphene import Enum, InputObjectType, Field, Int, Float
|
||||||
from django_elasticsearch_dsl import StringField, TextField, BooleanField, IntegerField, FloatField, LongField, \
|
from django_elasticsearch_dsl import StringField, TextField, BooleanField, IntegerField, FloatField, LongField, \
|
||||||
ShortField, DoubleField, DateField, KeywordField
|
ShortField, DoubleField, DateField, KeywordField, ObjectField
|
||||||
from django.utils import six
|
from django.utils import six
|
||||||
|
|
||||||
from django_filters.utils import try_dbfield
|
from django_filters.utils import try_dbfield
|
||||||
|
@ -18,22 +18,10 @@ FILTER_FOR_ESFIELD_DEFAULTS = {
|
||||||
TextField: {'filter_class': StringFilterES},
|
TextField: {'filter_class': StringFilterES},
|
||||||
BooleanField: {'filter_class': BoolFilterES},
|
BooleanField: {'filter_class': BoolFilterES},
|
||||||
IntegerField: {'filter_class': NumberFilterES},
|
IntegerField: {'filter_class': NumberFilterES},
|
||||||
FloatField: {'filter_class': NumberFilterES,
|
FloatField: {'filter_class': NumberFilterES, 'argument': Float()},
|
||||||
'extra': {
|
LongField: {'filter_class': NumberFilterES, 'argument': Int()},
|
||||||
'argument': Float()
|
ShortField: {'filter_class': NumberFilterES, 'argument': Int()},
|
||||||
}},
|
DoubleField: {'filter_class': NumberFilterES, 'argument': Int()},
|
||||||
LongField: {'filter_class': NumberFilterES,
|
|
||||||
'extra': {
|
|
||||||
'argument': Int()
|
|
||||||
}},
|
|
||||||
ShortField: {'filter_class': NumberFilterES,
|
|
||||||
'extra': {
|
|
||||||
'argument': Int()
|
|
||||||
}},
|
|
||||||
DoubleField: {'filter_class': NumberFilterES,
|
|
||||||
'extra': {
|
|
||||||
'argument': Int()
|
|
||||||
}},
|
|
||||||
DateField: {'filter_class': StringFilterES},
|
DateField: {'filter_class': StringFilterES},
|
||||||
KeywordField: {'filter_class': StringFilterES},
|
KeywordField: {'filter_class': StringFilterES},
|
||||||
}
|
}
|
||||||
|
@ -219,8 +207,12 @@ class FilterSetESMetaclass(type):
|
||||||
|
|
||||||
meta_filters = OrderedDict()
|
meta_filters = OrderedDict()
|
||||||
for name, index_field, data in index_fields:
|
for name, index_field, data in index_fields:
|
||||||
filter_class = mcs.get_filter_exp(name, index_field, data)
|
if isinstance(index_field, ObjectField):
|
||||||
meta_filters.update({name: filter_class})
|
filters_class = mcs.get_filter_object(name, index_field, data)
|
||||||
|
meta_filters.update(filters_class)
|
||||||
|
else:
|
||||||
|
filter_class = mcs.get_filter_exp(name, index_field, data)
|
||||||
|
meta_filters.update({name: filter_class})
|
||||||
|
|
||||||
return meta_filters
|
return meta_filters
|
||||||
|
|
||||||
|
@ -254,7 +246,7 @@ class FilterSetESMetaclass(type):
|
||||||
:param field: ES index field
|
:param field: ES index field
|
||||||
:param data: lookup_expr
|
:param data: lookup_expr
|
||||||
"""
|
"""
|
||||||
index_fields = []
|
index_fields = OrderedDict()
|
||||||
|
|
||||||
properties = field._doc_class._doc_type.mapping.properties._params.get('properties', {})
|
properties = field._doc_class._doc_type.mapping.properties._params.get('properties', {})
|
||||||
|
|
||||||
|
@ -263,8 +255,11 @@ class FilterSetESMetaclass(type):
|
||||||
if data and inner_name not in data:
|
if data and inner_name not in data:
|
||||||
# This inner field is not filterable
|
# This inner field is not filterable
|
||||||
continue
|
continue
|
||||||
|
|
||||||
inner_data = data[inner_name] if data else None
|
inner_data = data[inner_name] if data else None
|
||||||
index_fields.append(mcs.get_filter_exp(inner_name, inner_field, inner_data, root=name))
|
|
||||||
|
filter_exp = mcs.get_filter_exp(inner_name, inner_field, inner_data, root=name)
|
||||||
|
index_fields.update({inner_name: filter_exp})
|
||||||
|
|
||||||
return index_fields
|
return index_fields
|
||||||
|
|
||||||
|
@ -280,14 +275,10 @@ class FilterSetESMetaclass(type):
|
||||||
field_data = try_dbfield(FILTER_FOR_ESFIELD_DEFAULTS.get, field.__class__) or {}
|
field_data = try_dbfield(FILTER_FOR_ESFIELD_DEFAULTS.get, field.__class__) or {}
|
||||||
filter_class = field_data.get('filter_class')
|
filter_class = field_data.get('filter_class')
|
||||||
|
|
||||||
extra = field_data.get('extra', {})
|
kwargs = copy.deepcopy(data) if data is not None else {}
|
||||||
kwargs = copy.deepcopy(extra)
|
|
||||||
|
|
||||||
# Get lookup_expr from configuration
|
|
||||||
if data and 'lookup_expressions' in data:
|
|
||||||
kwargs['lookup_expressions'] = set(data['lookup_expressions'])
|
|
||||||
|
|
||||||
kwargs['field_name'], kwargs['field_name_es'] = mcs.get_name(name, root, data)
|
kwargs['field_name'], kwargs['field_name_es'] = mcs.get_name(name, root, data)
|
||||||
|
|
||||||
return filter_class(**kwargs)
|
return filter_class(**kwargs)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from graphene import ObjectType
|
from graphene import ObjectType
|
||||||
from django_elasticsearch_dsl import DocType, Index
|
from django_elasticsearch_dsl import DocType, Index, fields
|
||||||
|
|
||||||
from graphene_django.tests.models import Article
|
from graphene_django.tests.models import Article, Reporter
|
||||||
from graphene_django.filter.tests.test_fields import ArticleNode
|
from graphene_django.filter.tests.test_fields import ArticleNode
|
||||||
from graphene_django.elasticsearch.filter import filters
|
from graphene_django.elasticsearch.filter import filters
|
||||||
from graphene_django.elasticsearch.filter.fields import DjangoESFilterConnectionField
|
from graphene_django.elasticsearch.filter.fields import DjangoESFilterConnectionField
|
||||||
|
@ -24,6 +24,13 @@ class ArticleDocument(DocType):
|
||||||
'lang',
|
'lang',
|
||||||
'importance',
|
'importance',
|
||||||
]
|
]
|
||||||
|
related_models = (Reporter,)
|
||||||
|
|
||||||
|
reporter = fields.ObjectField(properties={
|
||||||
|
'id': fields.IntegerField(),
|
||||||
|
'first_name': fields.KeywordField(),
|
||||||
|
'email': fields.KeywordField(),
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
class ArticleFilterESAsField(FilterSetES):
|
class ArticleFilterESAsField(FilterSetES):
|
||||||
|
@ -64,7 +71,8 @@ class ArticleFilterESInMetaDict(FilterSetES):
|
||||||
'lte',
|
'lte',
|
||||||
'gte',
|
'gte',
|
||||||
]
|
]
|
||||||
}
|
},
|
||||||
|
'reporter': {},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -136,6 +136,14 @@ def test_filter_in_meta_dict():
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_filter_in_meta_dict_foreign():
|
||||||
|
filter_generation(
|
||||||
|
"articlesInMetaDict",
|
||||||
|
"reporterEamail: \"A mail\"",
|
||||||
|
Bool(must=[Match(reporter__email={'query': 'A mail', 'fuzziness': 'auto'})]),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def test_filter_in_multi_field():
|
def test_filter_in_multi_field():
|
||||||
filter_generation(
|
filter_generation(
|
||||||
"articlesInMultiField",
|
"articlesInMultiField",
|
||||||
|
|
Loading…
Reference in New Issue
Block a user