在我的graphql模式中使用DjangoConnectionField类型时遇到了一个问题。
我想使用自己的自定义解析器,该解析器将从Django模型中过滤查询集并对其进行排序。
我还想利用继电器输出格式。
在架构中使用的查询类中,我使用DjangoConnectionField设置了查询字段。
然后我为此编写了一个自定义解析器。
我现在的问题是,解析器返回的查询集总是以相同的顺序返回。我在resolver函数中的自定义排序被完全忽略。
我检查了返回的查询集,在到达最终返回值之前,自定义排序是完整的。它只有在从graphql端点吐出后才会被销毁。
有什么想法可以在保持中继自定义排序的同时还享受中继框架提供的结构(边缘,节点...)吗?
这是DjangoConnectionField的预期行为吗?
附注:我明确不想使用django-filter。
为了提供对该问题的一些参考,我在下面附加了一些代码:
class Query(ObjectType):
projects = DjangoConnectionField(
ProjectType, filter=ProjectFilterInput(), sort=graphene.String())
def resolve_projects(self, info, **args):
filterFields = args.get('filter')
sortFields = args.get('sort')
result = getFilteredProjects(filterFields, sortFields)
pprint(result)
return result
我的自定义getFilteredProjects函数包含以下代码:
def getFilteredProjects(filterFields, sortFields):
filteredResult = Project.objects.all()
filters = {
"name": {
"nameContains": "contains"
},
[...]
}
if filterFields:
for field_name, lookups in filters.items():
for lookup_input, lookup_expr in lookups.items():
if filterFields.get(lookup_input):
if lookup_expr == "in":
searchValue = filterFields.get(
lookup_input).split(",")
else:
searchValue = filterFields.get(lookup_input)
filter_args = {field_name + "__" +
lookup_expr: searchValue}
filteredResult = filteredResult.filter(**filter_args)
if sortFields:
sortFieldsArray = sortFields.split(",")
filteredResult = filteredResult.order_by(*sortFieldsArray)
return filteredResult
无论我做什么,“ resolve_projects”功能始终坚持相同的记录顺序,无论选择的文件管理器值如何,例如“-名称”。
当打印“结果”变量时,您会看到订单实际上受到了影响。似乎DjangoConnectionField都在强制执行自己的排序,无论您将其提供给什么...
如何通过自己的自定义排序获得相同的行为?
这在这里也不起作用...
def resolve_projects(self, info, **args):
return Project.objects.order_by("-name")
更新:
似乎这种行为与django-mptt和Relay有关。一些内部工作导致模型更改查询集顺序。...
使用常规的非mptt启用的模型,它可以工作!
我绝对不知道这是为什么...