mirror of
https://github.com/graphql-python/graphene-django.git
synced 2024-11-29 04:53:43 +03:00
Handle isnull filters differently (#753)
* Handle isnull filters differently * Change to rsplit
This commit is contained in:
parent
a64ba65bef
commit
e4cf59ecec
|
@ -56,8 +56,6 @@ if DJANGO_FILTER_INSTALLED:
|
||||||
model = Pet
|
model = Pet
|
||||||
interfaces = (Node,)
|
interfaces = (Node,)
|
||||||
|
|
||||||
# schema = Schema()
|
|
||||||
|
|
||||||
|
|
||||||
def get_args(field):
|
def get_args(field):
|
||||||
return field.args
|
return field.args
|
||||||
|
@ -820,6 +818,58 @@ def test_integer_field_filter_type():
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_other_filter_types():
|
||||||
|
class PetType(DjangoObjectType):
|
||||||
|
class Meta:
|
||||||
|
model = Pet
|
||||||
|
interfaces = (Node,)
|
||||||
|
filter_fields = {"age": ["exact", "isnull", "lt"]}
|
||||||
|
fields = ("age",)
|
||||||
|
|
||||||
|
class Query(ObjectType):
|
||||||
|
pets = DjangoFilterConnectionField(PetType)
|
||||||
|
|
||||||
|
schema = Schema(query=Query)
|
||||||
|
|
||||||
|
assert str(schema) == dedent(
|
||||||
|
"""\
|
||||||
|
schema {
|
||||||
|
query: Query
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Node {
|
||||||
|
id: ID!
|
||||||
|
}
|
||||||
|
|
||||||
|
type PageInfo {
|
||||||
|
hasNextPage: Boolean!
|
||||||
|
hasPreviousPage: Boolean!
|
||||||
|
startCursor: String
|
||||||
|
endCursor: String
|
||||||
|
}
|
||||||
|
|
||||||
|
type PetType implements Node {
|
||||||
|
age: Int!
|
||||||
|
id: ID!
|
||||||
|
}
|
||||||
|
|
||||||
|
type PetTypeConnection {
|
||||||
|
pageInfo: PageInfo!
|
||||||
|
edges: [PetTypeEdge]!
|
||||||
|
}
|
||||||
|
|
||||||
|
type PetTypeEdge {
|
||||||
|
node: PetType
|
||||||
|
cursor: String!
|
||||||
|
}
|
||||||
|
|
||||||
|
type Query {
|
||||||
|
pets(before: String, after: String, first: Int, last: Int, age: Int, age_Isnull: Boolean, age_Lt: Int): PetTypeConnection
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def test_filter_filterset_based_on_mixin():
|
def test_filter_filterset_based_on_mixin():
|
||||||
class ArticleFilterMixin(FilterSet):
|
class ArticleFilterMixin(FilterSet):
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|
|
@ -18,9 +18,16 @@ 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:
|
||||||
field_name = name.split("__", 1)[0]
|
try:
|
||||||
|
field_name, filter_type = name.rsplit("__", 1)
|
||||||
|
except ValueError:
|
||||||
|
field_name = name
|
||||||
|
filter_type = None
|
||||||
|
|
||||||
if hasattr(model, field_name):
|
# If the filter type is `isnull` then use the filter provided by
|
||||||
|
# DjangoFilter (a BooleanFilter).
|
||||||
|
# Otherwise try and get a filter based on the actual model field
|
||||||
|
if filter_type != "isnull" and hasattr(model, field_name):
|
||||||
model_field = model._meta.get_field(field_name)
|
model_field = model._meta.get_field(field_name)
|
||||||
|
|
||||||
if hasattr(model_field, "formfield"):
|
if hasattr(model_field, "formfield"):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user