mirror of
https://github.com/graphql-python/graphene-django.git
synced 2024-11-10 19:57:15 +03:00
Created Adding counts to DjangoFilterConnectionField (markdown)
parent
7daf3b1b9c
commit
25adb9b923
85
Adding-counts-to-DjangoFilterConnectionField.md
Normal file
85
Adding-counts-to-DjangoFilterConnectionField.md
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
`DjangoFilterConnectionField()` can be tricky to work with in cases where you wish to extend your schema. Fortunately, the solution is simple.
|
||||||
|
|
||||||
|
The trick here is to subclass `Connection` and declare a `connection_class` on your node type. In your Query declarations, `DjangoFilterConnectionField` will use that declared `connection_class` class seamlessly wherever it's defined.
|
||||||
|
|
||||||
|
You can now easily implement counts (or really anything) on your extended `Connection` class and use them in your queries, while retaining the built-in filtering that comes with `DjangoFilterConnectionField`:
|
||||||
|
|
||||||
|
```
|
||||||
|
from graphene import ObjectType, Connection, Node, Int
|
||||||
|
from graphene_django import DjangoObjectType
|
||||||
|
from graphene_django.filter import DjangoFilterConnectionField
|
||||||
|
from ..models import Place
|
||||||
|
|
||||||
|
|
||||||
|
class ExtendedConnection(Connection):
|
||||||
|
class Meta:
|
||||||
|
abstract = True
|
||||||
|
|
||||||
|
total_count = Int()
|
||||||
|
edge_count = Int()
|
||||||
|
|
||||||
|
def resolve_total_count(root, info, **kwargs):
|
||||||
|
return root.length
|
||||||
|
def resolve_edge_count(root, info, **kwargs):
|
||||||
|
return len(root.edges)
|
||||||
|
|
||||||
|
|
||||||
|
class PlaceType(DjangoObjectType):
|
||||||
|
class Meta:
|
||||||
|
model = Place
|
||||||
|
filter_fields = {
|
||||||
|
'id': ['exact', 'icontains'],
|
||||||
|
'name': ['exact', 'icontains', 'istartswith', 'iendswith'],
|
||||||
|
}
|
||||||
|
interfaces = (Node, )
|
||||||
|
connection_class = ExtendedConnection
|
||||||
|
|
||||||
|
|
||||||
|
class Query(ObjectType):
|
||||||
|
places = DjangoFilterConnectionField(PlaceType)
|
||||||
|
```
|
||||||
|
|
||||||
|
This allows, on this example `schema`, querying:
|
||||||
|
```
|
||||||
|
{
|
||||||
|
places(first: 2, name_Icontains: "Dallas", after: "YXJyYXljb25uZWN0aW9uOjE1") {
|
||||||
|
totalCount
|
||||||
|
edgeCount
|
||||||
|
edges {
|
||||||
|
cursor
|
||||||
|
node {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Which returns:
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"places": {
|
||||||
|
"totalCount": 23,
|
||||||
|
"edgeCount": 2,
|
||||||
|
"edges": [
|
||||||
|
{
|
||||||
|
"cursor": "YXJyYXljb25uZWN0aW9uOjE2",
|
||||||
|
"node": {
|
||||||
|
"id": "UGxhY2VUeXBlOjUxOA==",
|
||||||
|
"name": "Dallas, Dallas, Texas, United States"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cursor": "YXJyYXljb25uZWN0aW9uOjE3",
|
||||||
|
"node": {
|
||||||
|
"id": "UGxhY2VUeXBlOjU0Nw==",
|
||||||
|
"name": "Election Precinct 4 Valley Creek, Dallas, Alabama, United States"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
Loading…
Reference in New Issue
Block a user