Graphene.Field() с filter() и graphene.List() с get() возвращают ошибки (Graphene Django)
<Case 1>
Я использовал "graphene.Field()" с "get()" и "graphene.List()" с "filter()" для получения одного конкретного объекта.
"graphene.Field()" с "get()" в schema.py:
import graphene
from graphene_django import DjangoObjectType
from .models import Category
class CategoryType(DjangoObjectType):
class Meta:
model = Category
fields = ("id","name")
all_categories = graphene.Field(CategoryType, id=graphene.Int()) # graphene.Field()
def resolve_all_categories(root, info, id):
return Category.objects.get(pk=id) # get()
schema = graphene.Schema(query=Query)
"graphene.List()" с "filter()" в schema.py:
import graphene
from graphene_django import DjangoObjectType
from .models import Category
class CategoryType(DjangoObjectType):
class Meta:
model = Category
fields = ("id","name")
all_categories = graphene.List(CategoryType, id=graphene.Int()) # graphene.List()
def resolve_all_categories(root, info, id):
return Category.objects.filter(pk=id) # filter()
schema = graphene.Schema(query=Query)
Затем, я запросил "allCategories" для обоих кодов в schema.py выше по очереди:
query {
allCategories(id:1) {
id
name
}
}
Наконец, я получил этот результат без ошибок для "graphene.Field()" с "get()" в schema.py:
{
"data": {
"allCategories": {
"id": "1",
"name": "category1"
}
}
}
И этот результат без ошибок для "graphene.List()" с "filter()" в schema.py:
{
"data": {
"allCategories": [
{
"id": "1",
"name": "category1"
}
]
}
}
<Case 2>
Далее я использовал "graphene.Field()" с "filter()" и "graphene.List()" с "get()" для получения одного конкретного объекта.
"graphene.Field()" с "filter()" в schema.py:
import graphene
from graphene_django import DjangoObjectType
from .models import Category
class CategoryType(DjangoObjectType):
class Meta:
model = Category
fields = ("id","name")
all_categories = graphene.Field(CategoryType, id=graphene.Int()) # graphene.Field()
def resolve_all_categories(root, info, id):
return Category.objects.filter(pk=id) # filter()
schema = graphene.Schema(query=Query)
"graphene.List()" с "get()" в schema.py:
import graphene
from graphene_django import DjangoObjectType
from .models import Category
class CategoryType(DjangoObjectType):
class Meta:
model = Category
fields = ("id","name")
all_categories = graphene.List(CategoryType, id=graphene.Int()) # graphene.List()
def resolve_all_categories(root, info, id):
return Category.objects.get(pk=id) # get()
schema = graphene.Schema(query=Query)
Затем, я запросил "allCategories" для обоих кодов в schema.py выше по очереди:
query {
allCategories(id:1) {
id
name
}
}
Но наконец, я получил эту ошибку для "graphene.Field()" с "filter()" в schema.py:
{
"errors": [
{
"message": "Received incompatible instance \"<QuerySet [<Category: category1>]>\"."
}
],
"data": {
"allCategories": null
}
}
И эта ошибка для "graphene.List()" с "get()" в schema.py:
{
"errors": [
{
"message": "User Error: expected iterable, but did not find one for field Query.allCategories."
}
],
"data": {
"allCategories": null
}
}
Почему я получил эти две ошибки выше для "<Case 2>" отличающиеся от "<Case 1>"?
"graphene.Field()" не соответствует "filter()" и "graphene.List()" не соответствует "get()".
✖ "graphene.Field()" + "filter()"
✖ "graphene.List()" + "get()"
"graphene.Field()" совпадает с "get()" и "graphene.List()" совпадает с "filter()".
〇 "graphene.Field()" + "get()"
〇 "graphene.List()" + "filter()"
"graphene.Field()" предназначен для одного объекта с фигурными скобками "{}" самой внешней части и "get()" может вернуть один объект с фигурными скобками "{}" самой внешней части, поэтому "graphene. Field()" совпадает с "get()".
Пример:
{
"name": "John",
"age": "32",
"gender": "Male"
}
Вы можете увидеть свой результат для "graphene.Field()" с "get()" в schema. py, "<Case 1>" имеет один объект с фигурными скобками "{}" для "allCategories" внутри "data":
{
"data": {
"allCategories": { // Curly Braces "{}"
"id": "1",
"name": "category1"
}
}
}
"graphene. List()" предназначен для списка(множества) из одного или нескольких объектов с квадратными скобками "[]" самой внешней и "filter()" может вернуть список(множество) из одного или нескольких объектов с квадратными скобками "[]" самой внешней так что "graphene. List()" совпадает с "filter()":
Пример:
[
{
"name": "John",
"age": "32",
"gender": "Male"
},
{
"name": "Tom",
"age": "17",
"gender": "Male"
},
{
"name": "Marry",
"age": "24",
"gender": "Female"
}
]
Вы можете увидеть свой результат для "graphene.List()" с "filter()" в schema. py, "<Case 1>" имеет список (набор) из одного объекта с квадратными скобками "[]" для "allCategories" внутри "data":
{
"data": {
"allCategories": [ // Square Brackets "[]"
{
"id": "1",
"name": "category1"
}
]
}
}
Некоторые функции, которые можно использовать с "graphene.Field()":
get()
first()
last()
...
There will be some more functions to be able to use with "graphene.Field()"
Некоторые функции, которые можно использовать с "graphene.List()":
filter()
aggregate()
all()
annotate()
extra()
check()
iterator()
...
There will be some more functions to be able to use with "graphene.List()"