Я пытался реализовать GraphQL в существующей Django REST Framework. Я использовал графен-джанго == 2.2.0
Он был успешно реализован. Но нельзя использовать ключевое слово «последнее» в запросе запроса. Я добавляю код схемы.
import graphene
from graphene_django.types import DjangoObjectType
from flowers.models import Flower
class FlowerType(DjangoObjectType):
class Meta:
model = Flower
class Query(graphene.ObjectType):
flowers = graphene.List(FlowerType)
def resolve_flowers(self, info, **kwargs):
return Flower.objects.all()
Запрос
{
flowers (last: 2){
id
}
}
Результат
{
"errors": [
{
"locations": [
{
"column": 12,
"line": 2
}
],
"message": "Unknown argument \"last\" on field \"flowers\" of type \"Query\"."
}
]
}
Нужно ли мне изменять код в проекте Django? Как это решить?





В вашей схеме GraphQL. Вам нужно указать конкретный запрос, который принимает последний аргумент и возвращает запрос. Пожалуйста, укажите тип возвращаемого цветка (в вашем случае)
class Query(graphene.ObjectType):
flowers = graphene.List(FlowerType, last=graphene.Int())
def resolve_flowers(self, args, context, info):
query = FlowerType.get_query(context)
return query.get(args.get('last'))
Or
query($last: Int!): ReturnType
И вы можете изменить свой запрос на этот
query($flowerId: 2) {
flowers (last: $flowerId){
id
}
}
Или просто используйте Relay, он уже предоставляет этот фильтр, среди прочего.
class FlowerType(DjangoObjectType):
class Meta:
model = Flower
interfaces = (graphene.relay.Node,)
class FlowerConnection(graphene.relay.Connection):
class Meta:
node = FlowerType
class Query(graphene.ObjectType):
flowers = graphene.relay.ConnectionField(FlowerConnection)
def resolve_flowers(self, info, **kwargs):
return Flower.objects.all()
lastNPosts = graphene.List(PostType, N=graphene.Int())
def resolve_lastNPosts(self, info, N):
try:
return Post.objects.order_by('-id')[:N]
except Post.DoesNotExist:
return None