bring back django-filter with method test

This commit is contained in:
Jason Kraus 2019-10-21 12:55:44 -07:00
parent 871e7b2a52
commit 15b661ae26
2 changed files with 17 additions and 10 deletions

View File

@ -877,7 +877,7 @@ def test_filter_filterset_based_on_mixin():
filters = super(FilterSet, cls).get_filters()
filters.update(
{
"reporter__email__in": django_filters.CharFilter(
"viewer__email__in": django_filters.CharFilter(
method="filter_email_in", field_name="reporter__email__in"
)
}
@ -897,11 +897,16 @@ def test_filter_filterset_based_on_mixin():
interfaces = (Node,)
class NewArticleFilterNode(DjangoObjectType):
viewer = Field(NewReporterNode)
class Meta:
model = Article
interfaces = (Node,)
filterset_class = NewArticleFilter
def resolve_viewer(self, info):
return self.reporter
class Query(ObjectType):
all_articles = DjangoFilterConnectionField(NewArticleFilterNode)
@ -934,11 +939,11 @@ def test_filter_filterset_based_on_mixin():
query = (
"""
query NodeFilteringQuery {
allArticles(reporter_Email_In: "%s") {
allArticles(viewer_Email_In: "%s") {
edges {
node {
headline
reporter {
viewer {
email
}
}
@ -955,7 +960,7 @@ def test_filter_filterset_based_on_mixin():
{
"node": {
"headline": article_1.headline,
"reporter": {"email": reporter_1.email},
"viewer": {"email": reporter_1.email},
}
}
]

View File

@ -6,12 +6,13 @@ from django.db.models.fields.related import ForeignObjectRel, RelatedField
from .filterset import custom_filterset_factory, setup_filterset
def get_field_parts_with_expression(model, query_expr):
def get_field_parts_with_expression(model, field_name, lookup_expr):
"""
Traverses the model with a given query expression,
returns the found fields along the path and the remaining expression
"""
parts = query_expr.split(LOOKUP_SEP)
parts = field_name.split(LOOKUP_SEP) # + lookup_expr.split(LOOKUP_SEP)
lparts = lookup_expr.split(LOOKUP_SEP)
opts = model._meta
fields = []
@ -20,7 +21,7 @@ def get_field_parts_with_expression(model, query_expr):
try:
field = opts.get_field(name)
except FieldDoesNotExist:
return fields, LOOKUP_SEP.join(parts[i:])
return fields, LOOKUP_SEP.join(parts[i:] + lparts)
fields.append(field)
if isinstance(field, RelatedField):
@ -28,7 +29,7 @@ def get_field_parts_with_expression(model, query_expr):
elif isinstance(field, ForeignObjectRel):
opts = field.related_model._meta
return fields, "exact"
return fields, lookup_expr
def get_filtering_args_from_filterset(filterset_class, type):
@ -46,8 +47,9 @@ def get_filtering_args_from_filterset(filterset_class, type):
if name in filterset_class.declared_filters:
form_field = filter_field.field
else:
fields, lookup_expr = get_field_parts_with_expression(model, name)
assert fields, str((model, name, filterset_class))
fields, lookup_expr = get_field_parts_with_expression(
model, filter_field.field_name, filter_field.lookup_expr
)
model_field = fields[-1]
filter_type = lookup_expr