石墨烯-Dhango嵌套滤波器(继电器)

时间:2018-03-16 17:13:18

标签: python django graphql graphene-python

我正在尝试使用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个嵌套节点执行此操作。

1 个答案:

答案 0 :(得分:0)

我认为你在这两个模型之间有OneToOneField,如果它是真的,你就不能拥有这样的东西,因为它不合逻辑

想象一下,如果用户拥有受众特征,并且您检索了所有用户,那么对于每个用户,我们都有一个受众特征,过滤一个受众特征是不合逻辑的。唯一的方法是使用UserNode过滤它(正如你所说和所做的那样)

如果你有一个ForeignKey或ManyToManyField到用户模型,嵌套过滤就可以工作了,然后你可以在用户中使用单独的过滤器检索它

我希望我能够向你说清楚