石墨烯-Django嵌套过滤器(继电器)



我正在尝试使用石墨烯-django的DjangoFilterConnectionField实现以下目标:

{
  allUsers(username_Icontains: "abc") {
    edges {
      node {
        id
        demographics (name_Icontains: "xyz") {
          id
          name
        }
      }
    }
  }
}

我知道在石墨烯django中,可以使用石墨烯的列表进行嵌套过滤但我不确定我是否可以使用 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)

文档中,建议在连接的节点上引入每个过滤器。所以它会是这样的:

class UserNode(DjangoObjectType):
    class Meta:
        model = User
        interfaces = (Node,)
        filter_fields = {
            'username': ['exact', 'icontains', 'in'],
            'demographic__name': ['icontains']
        }

但我认为必须有更好的方法来做到这一点,因为我必须为 20 多个嵌套节点执行此操作。

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

想象一下,如果一个用户有一个人口统计,并且你检索了所有用户,那么对于每个用户,我们都有一个人口统计,过滤一个人口统计是不合逻辑的。 执行此操作的唯一方法是使用UserNode对其进行过滤(正如您所说和所做的(

嵌套过滤仅在您有一个外键或 ManyToManyField 到用户模型时才有效,然后您可以使用单独的过滤器在用户中检索它

我希望我能够向你说清楚

最新更新