Как фильтровать в Django-graphene?

Я использую graphene-Django для создания GraphQL API. Я успешно создал этот API, но я не могу передать аргумент для фильтрации ответа. Я хочу фильтровать с помощью ключа ковки из моей модели.

model.py:

class TodoList(models.Model):
    userId = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=150)
    date = models.DateField(auto_now=True)
    text = models.TextField()

schema.py:

class TodoView(DjangoObjectType):
    class Meta:
        model = TodoList
        fields = ('id', 'title', 'date', 'text')
        

class UserType(DjangoObjectType):
    class Meta:
        model = User

class TodoQuery(graphene.ObjectType):
    todoList = DjangoListField(TodoView)

    def resolve_all_todo(root, info):
        return TodoList.objects.filter(userId=2)

Но когда я делаю фильтр, он показывает все объекты в результате

Когда я посылаю этот запрос:

{
  todoList {
    id
    title
    date
    text
  }
}

Я получил такой ответ:

{
  "data": {
    "todoList": [
      {
        "id": "1",
        "title": "test",
        "date": "2021-09-13",
        "text": "test todo"
      },
      {
        "id": "2",
        "title": "test2",
        "date": "2021-09-13",
        "text": "test2"
      },
      {
        "id": "3",
        "title": "admin2 test",
        "date": "2021-09-13",
        "text": "admin2 test"
      },
      {
        "id": "4",
        "title": "admin2 test2",
        "date": "2021-09-14",
        "text": "admin2 test2"
      }
    ]
  }
}

Что я упустил? Или может быть я делаю что-то не так?

У вас есть два варианта,

  1. Измените имя метода резольвера на resolve_todoList(...) с resolve_all_todo(...)
  2. .

class TodoQuery(graphene.ObjectType):
    todoList = DjangoListField(TodoView)

    def resolve_todoList(root, info):
        return TodoList.objects.filter(userId=2)
  1. Используйте аргумент resolver для указания вашего метода резольвера
  2. .
class TodoQuery(graphene.ObjectType):
    todoList = DjangoListField(TodoView, resolver="resolve_all_todo")

    def resolve_all_todo(root, info):
        return TodoList.objects.filter(userId=2)
Вернуться на верх