【发布时间】:2018-08-25 20:15:15
【问题描述】:
我正在尝试使用 graphene-django 的 DjangoFilterConnectionField 实现以下目标:
{
allUsers(username_Icontains: "abc") {
edges {
node {
id
demographics (name_Icontains: "xyz") {
id
name
}
}
}
}
}
我知道在石墨烯 django 中,可以使用 graphene's List 进行嵌套过滤
但我不确定我是否可以使用DjangoFilterConnectionField 解决这个问题。
我有以下石墨烯(中继)架构:
class UserNode(DjangoObjectType):
class Meta:
model = User
interfaces = (Node,)
filter_fields = {
'username': ['exact', 'icontains', 'in'],
}
class DemographicNode(DjangoObjectType):
class Meta:
model = Demographic
interfaces = (Node,)
filter_fields = {
'name': ['icontains'],
}
class Query(ObjectType):
user = Node.Field(UserNode)
all_users = DjangoFilterConnectionField(UserNode)
demographic = Node.Field(DemographicNode)
all_demographics = DjangoFilterConnectionField(DemographicNode)
在docs 中建议在连接节点上也引入每个过滤器。所以它会是这样的:
class UserNode(DjangoObjectType):
class Meta:
model = User
interfaces = (Node,)
filter_fields = {
'username': ['exact', 'icontains', 'in'],
'demographic__name': ['icontains']
}
但我认为必须有更好的方法来执行此操作,因为我必须为 20 多个嵌套节点执行此操作。
【问题讨论】:
-
这远非理想,但也许您可以获取
DemographicNode._meta.filter_fields并将它们添加到UserNode(可能在UserNode的__init__中),前置demographic__?跨度> -
是的,我想我最终还是会这样做。
-
遇到和你一样的问题。我来自
django rest framework(DRF),嵌套过滤使用django-filter开箱即用,我只需要在每个父子FilterSet元类上指定fields,根本不需要双下划线。但是graphene-django似乎不支持这一点,因此您必须在父 FilterSet 中指定所有嵌套字段并在那里使用双下划线。忽略子 FilterSet 中的元信息这一事实可能会导致代码重复,尤其是当子 FilterSet 被多个父 FilterSet 重用时。
标签: python django graphql graphene-python