DjangoListField() vs graphene.List() в Graphene Django

Я использовал как "DjangoListField()", так и "graphene.List()".

"DjangoListField()" в schema.py:

import graphene
from graphene_django import DjangoObjectType
from graphene_django import DjangoListField
from .models import Category

class CategoryType(DjangoObjectType):
    class Meta:
        model = Category
        fields = ("id","name")

class Query(graphene.ObjectType):

    all_categories = DjangoListField(CategoryType) # Here

    def resolve_all_categories(root, info):
        return Category.objects.all()

"graphene.List()" в schema.py:

import graphene
from graphene_django import DjangoObjectType
from .models import Category

class CategoryType(DjangoObjectType):
    class Meta:
        model = Category
        fields = ("id","name")

class Query(graphene.ObjectType):

    all_categories = graphene.List(CategoryType) # Here

    def resolve_all_categories(root, info):
        return Category.objects.all()

Затем я запросил "allCategories":

query {
  allCategories {
    id
    name
  }
}

Но результат тот же:

{
  "data": {
    "allCategories": [
      {
        "id": "1",
        "name": "category1"
      },
      {
        "id": "2",
        "name": "category2"
      }
    ]
  }
}

В чем разница между "DjangoListField()" и "graphene.List()"?

"DjangoListField()" не требует Resolver, но "graphene.List()" требует Resolver.

По умолчанию "DjangoListField()" будет разрешать стандартный кверисет модели Django.

Итак, если вы удалите Resolver из вашего кода с помощью "DjangoListField()":

import graphene
from graphene_django import DjangoObjectType
from graphene_django import DjangoListField
from .models import Category

class CategoryType(DjangoObjectType):
    class Meta:
        model = Category
        fields = ("id","name")

class Query(graphene.ObjectType):

    all_categories = DjangoListField(CategoryType) # Here

Затем, вы запрашиваете "allCategories":

query {
  allCategories {
    id
    name
  }
}

Наконец, ошибка отсутствует:

{
  "data": {
    "allCategories": [
      {
        "id": "1",
        "name": "category1"
      },
      {
        "id": "2",
        "name": "category2"
      }
    ]
  }
}

Но если вы удалите Resolver из вашего кода с помощью "graphene.List()":

import graphene
from graphene_django import DjangoObjectType
from .models import Category

class CategoryType(DjangoObjectType):
    class Meta:
        model = Category
        fields = ("id","name")

class Query(graphene.ObjectType):

    all_categories = graphene.List(CategoryType) # Here

    def resolve_all_categories(root, info):
        return Category.objects.all()

Затем, вы запрашиваете "allCategories":

query {
  allCategories {
    id
    name
  }
}

Наконец, возникает ошибка:

{
  "errors": [
    {
      "message": "Cannot query field \"allCategories\" on type \"Query\". Did you mean \"allCategory\"?",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ]
    }
  ]
}

Подробнее о "DjangoListField()" вы можете узнать на этой странице DjangoListField.

Вернуться на верх