mirror of
https://github.com/graphql-python/graphene-django.git
synced 2025-07-18 12:12:41 +03:00
refactor based on better knowledge of django-filters
This commit is contained in:
parent
cae2ba8886
commit
98d717e30e
|
@ -1,37 +1,9 @@
|
||||||
import six
|
import six
|
||||||
|
|
||||||
from django.db.models.constants import LOOKUP_SEP
|
from django_filters.utils import get_model_field
|
||||||
from django.core.exceptions import FieldDoesNotExist
|
|
||||||
from django.db.models.fields.related import ForeignObjectRel, RelatedField
|
|
||||||
from .filterset import custom_filterset_factory, setup_filterset
|
from .filterset import custom_filterset_factory, setup_filterset
|
||||||
|
|
||||||
|
|
||||||
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 = field_name.split(LOOKUP_SEP)
|
|
||||||
lparts = lookup_expr.split(LOOKUP_SEP)
|
|
||||||
opts = model._meta
|
|
||||||
fields = []
|
|
||||||
|
|
||||||
# walk relationships
|
|
||||||
for i, name in enumerate(parts):
|
|
||||||
try:
|
|
||||||
field = opts.get_field(name)
|
|
||||||
except FieldDoesNotExist:
|
|
||||||
return fields, LOOKUP_SEP.join(parts[i:] + lparts)
|
|
||||||
|
|
||||||
fields.append(field)
|
|
||||||
if isinstance(field, RelatedField):
|
|
||||||
opts = field.remote_field.model._meta
|
|
||||||
elif isinstance(field, ForeignObjectRel):
|
|
||||||
opts = field.related_model._meta
|
|
||||||
|
|
||||||
return fields, lookup_expr
|
|
||||||
|
|
||||||
|
|
||||||
def get_filtering_args_from_filterset(filterset_class, type):
|
def get_filtering_args_from_filterset(filterset_class, type):
|
||||||
""" Inspect a FilterSet and produce the arguments to pass to
|
""" Inspect a FilterSet and produce the arguments to pass to
|
||||||
a Graphene Field. These arguments will be available to
|
a Graphene Field. These arguments will be available to
|
||||||
|
@ -47,12 +19,8 @@ def get_filtering_args_from_filterset(filterset_class, type):
|
||||||
if name in filterset_class.declared_filters:
|
if name in filterset_class.declared_filters:
|
||||||
form_field = filter_field.field
|
form_field = filter_field.field
|
||||||
else:
|
else:
|
||||||
fields, lookup_expr = get_field_parts_with_expression(
|
model_field = get_model_field(model, filter_field.field_name)
|
||||||
model, filter_field.field_name, filter_field.lookup_expr
|
filter_type = filter_field.lookup_expr
|
||||||
)
|
|
||||||
model_field = fields[-1]
|
|
||||||
filter_type = lookup_expr
|
|
||||||
|
|
||||||
if filter_type != "isnull" and hasattr(model_field, "formfield"):
|
if filter_type != "isnull" and hasattr(model_field, "formfield"):
|
||||||
form_field = model_field.formfield(
|
form_field = model_field.formfield(
|
||||||
required=filter_field.extra.get("required", False)
|
required=filter_field.extra.get("required", False)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user