Использование:
- Django 3.x [Django -фильтры 2.2.0, графен- django 2.8.0, graphql-relay 2.0.1]
- Vue 2.x [Vue -Apollo]
У меня есть простая Birds
Django -модель с полями типа name
, habitat
и применил к этим полям различные фильтры, такие как icontains
или iexact
. Моей целью было применить простое поле поиска в моем интерфейсе (Vue). Пока это работает, но всякий раз, когда это значение фильтра пусто или имеет пробелы (см. Пример 3) , Graphql возвращает все объекты.
Мой первый подход был на FrontEnd и использовать какую-то логику c для моего входного значения, например, когда String равен Empty / blank send isnull=true
. Но потом я подумал, что Django должен справиться с этим в первую очередь. Я предполагаю, что эта проблема связана с моими filters
(см. Django или другими словами, нужно ли мне применять какие-то логи c к этим Фильтры?
В данный момент я пытаюсь настроить некоторые filterset_class
, но кажется, что это может быть слишком много, может быть, я что-то упустил? Поэтому я спрашиваю здесь, может быть, у кого-то есть какие-то подсказки, поэтому мой вопрос:
Как остановить Graphql + Django -Filters для возврата всех объектов, когда строка фильтра пуста?
GraphiQL IDE
Пример 1
query {birdsNodeFilter (name_Iexact: "finch") {
edges {
node {
id
name
}
}
}
}
Возвраты
{
"data": {
"birdsNodeFilter": {
"edges": [
{
"node": {
"id": "QmlyZHNOb2RlOjE=",
"name": "Finch",
"habitat": "Europe"
}
}
]
}
}
}
Отлично для меня!
Пример 2
query {birdsNodeFilter (name_Iexact: "Unicorns") {
edges {
node {
id
name
habitat
}
}
}
}
Возвращает
{
"data": {
"birdsNodeFilter": {
"edges": []
}
}
}
Там нет единорогов - хорошо
Пример 3
query {birdsNodeFilter (name_Iexact: "") {
edges {
node {
id
name
}
}
}
}
Возврат
{
"data": {
"birdsNodeFilter": {
"edges": [
{
"node": {
"id": "QmlyZHNOb2RlOjE=",
"name": "Finch",
"habitat": "Europe"
}
},
{
"node": {
"id": "QmlyZHNOb2RlOjI=",
"name": "Bald Eagle",
"habitat": "USA"
}
},
<...And so on...>
Не подходит для меня!
Django
relay_schema.py
class BirdsNode(DjangoObjectType):
class Meta:
model = Birds
filter_fields = {
'id': ['iexact'],
'name': ['iexact', 'icontains', 'istartswith', 'isnull'],
'habitat': ['iexact', 'icontains', 'istartswith'],
}
interfaces = (relay.Node, )
class BirdQuery(graphene.ObjectType):
birdConNode = relay.Node.Field(BirdsNode)
birdsNodeFilter = DjangoFilterConnectionField(BirdsNode)