Repository: graphql-python/graphene-django

Issue:
Bug: Supposedly wrong types in query with filter_fields since 2.4.0
### Problem
When using filter_fields I get an error about using wrong types which started appearing in 2.4.0.
`Variable "startedAtNull" of type "Boolean" used in position expecting type "DateTime".` The error does not occur with graphene-django 2.3.2

### Context
- using django-filter 2.2.0
- django 2.4.0
### 
**Schema.py**
```
DATETIME_FILTERS = ['exact', 'isnull', 'lt', 'lte', 'gt', 'gte', 'month', 'year', 'date']

class OrderNode(DjangoObjectType):
    class Meta:
        model = Order
        exclude = ('tenant', )
        filter_fields = {
            'id': ['exact'],
            'start_at': DATETIME_FILTERS,
            'finish_at': DATETIME_FILTERS,
            'finished_at': DATETIME_FILTERS,
            'started_at': DATETIME_FILTERS,
        }
        interfaces = (OrderNodeInterface,)
```

**Query:**
```
ORDERS_QUERY = '''
    query order(
        $tenant: String
        $projectId: ID
        $startedAtNull: Boolean
    ) {
        orders(
            tenant: $tenant
            project_Id: $projectId
            startedAt_Isnull: $startedAtNull
        ) {
            edges {
                node {
                    id,
                    city
                }
            }
        }
    }
'''
```

**Result:**
`Variable "startedAtNull" of type "Boolean" used in position expecting type "DateTime".`




### Solution
I am confident it is related to this PR: https://github.com/graphql-python/graphene-django/pull/682/files . In graphene_django/filter/utils.py the way how to retrieve the Type of a field was changed. Or maybe I misunderstood the changelog.


Discussion:
@lassesteffen does the same issue happen with v2.5.0? It contained a bugfix that looks related: https://github.com/graphql-python/graphene-django/pull/730
I encounter the same issue after upgrading from 2.3.2 to 2.4.0 or 2.5.0.  The expected type for an `isnull` filter changed from boolean to ID.

Schema:
```class Folder(DjangoObjectType):

    class Meta:
        model = models.Folder
        interfaces = (relay.Node, )
        filter_fields = {
            'parent': ['exact', 'isnull'],
        }
```

Query:
```
{
  user {
    folders(parent_Isnull: true) {
      edges {
        node {
          id
        }
      }
    }
  }
}
```

Result:
```
{
  "errors": [
    {
      "message": "Argument \"parent_Isnull\" has invalid value true.\nExpected type \"ID\", found true.",
      "locations": [
        {
          "line": 8,
          "column": 30
        }
      ]
    }
  ]
}
```
Hmm ok this looks like a bug, sorry about that. I'll take a look as soon as possible.

Resolving patch:
diff --git a/graphene_django/filter/utils.py b/graphene_django/filter/utils.py
--- a/graphene_django/filter/utils.py
+++ b/graphene_django/filter/utils.py
@@ -18,9 +18,16 @@ def get_filtering_args_from_filterset(filterset_class, type):
         if name in filterset_class.declared_filters:
             form_field = filter_field.field
         else:
-            field_name = name.split("__", 1)[0]
-
-            if hasattr(model, field_name):
+            try:
+                field_name, filter_type = name.rsplit("__", 1)
+            except ValueError:
+                field_name = name
+                filter_type = None
+
+            # 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)
 
                 if hasattr(model_field, "formfield"):


Test patch:
diff --git a/graphene_django/filter/tests/test_fields.py b/graphene_django/filter/tests/test_fields.py
--- a/graphene_django/filter/tests/test_fields.py
+++ b/graphene_django/filter/tests/test_fields.py
@@ -56,8 +56,6 @@ class Meta:
             model = Pet
             interfaces = (Node,)
 
-    # schema = Schema()
-
 
 def get_args(field):
     return field.args
@@ -820,6 +818,58 @@ class Query(ObjectType):
     )
 
 
+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():
     class ArticleFilterMixin(FilterSet):
         @classmethod