Graphene Django 中的 DjangoListField() 与 graphene.List()

4 python django python-3.x graphql graphene-django

我使用“DjangoListField()”“graphene.List()”解析器来列出所有对象

schema.py 中的“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) # DjangoListField()

    def resolve_all_categories(root, info): # Resolver to list all objects
        return Category.objects.all()

schema = graphene.Schema(query=Query)
Run Code Online (Sandbox Code Playgroud)

schema.py 中的“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) # graphene.List()

    def resolve_all_categories(root, info): # Resolver to list all objects
        return Category.objects.all()

schema = graphene.Schema(query=Query)
Run Code Online (Sandbox Code Playgroud)

然后,我在“allCategories”中一一查询了上面schema.py中的两段代码:

query {
  allCategories {
    id
    name
  }
}
Run Code Online (Sandbox Code Playgroud)

但列出所有对象的结果是相同的:

{
  "data": {
    "allCategories": [
      {
        "id": "1",
        "name": "category1"
      },
      {
        "id": "2",
        "name": "category2"
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

“DjangoListField()”“graphene.List()”有什么区别?

小智 5

“DjangoListField()”具有默认解析器来列出所有对象,但“graphene.List()”没有它,因此对于“graphene.List()”,您需要显式定义解析器来列出所有对象,否则您会得到“无效的”

因此,如果您使用“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) # DjangoListField()

schema = graphene.Schema(query=Query)
Run Code Online (Sandbox Code Playgroud)

然后,您查询“allCategories”

query {
  allCategories {
    id
    name
  }
}
Run Code Online (Sandbox Code Playgroud)

最后,您仍然可以列出所有对象

{
  "data": {
    "allCategories": [
      {
        "id": "1",
        "name": "category1"
      },
      {
        "id": "2",
        "name": "category2"
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您使用“graphene.List()”从代码中删除Resolver

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) # graphene.List()

schema = graphene.Schema(query=Query)
Run Code Online (Sandbox Code Playgroud)

然后,您查询“allCategories”

query {
  allCategories {
    id
    name
  }
}
Run Code Online (Sandbox Code Playgroud)

最后,您无法列出所有对象,而是得到“null”

{
  "data": {
    "allCategories": null
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以在此页面DjangoListField中获得有关“DjangoListField()”的更多详细信息。