聚集石墨烯/ Django查询中的字段

时间:2020-04-27 21:32:23

标签: python django graphql graphene-django

我正在编写一个石墨烯/ Django ORM查询,在这里我需要在所有查询结果对象上聚合特定字段的值,并将其与查询一起返回。不太确定如何执行此操作,因为这涉及一些后处理。如果有人可以提供一些指导,将不胜感激。

这是一些示例代码。 Django模型类“市场”具有一个整数字段“ num_vendors”。石墨烯包装器是“ MarketNode”,它包装了“市场”模型类:

模型类:

class Market(models.Model):
       num_vendors = models.IntegerField(....)

石墨烯类:

class MarketNode(DjangoObjectType):
   Meta:
      model: Market

我希望查询返回“ market_count”(有多个市场)和“ vendor_count”(所有市场上所有“供应商”的总和)。因此查询如下所示:

allMarkets {
  market_count
  vendor_count
  edges {
    node {
      ...
      ...
      num_vendors
      ...
    }
  }
}

对于market_count,我遵循以下示例(此方法正常): https://github.com/graphql-python/graphene-django/wiki/Adding-counts-to-DjangoFilterConnectionField

对于vendor_count(在所有市场中),我假设我需要遍历结果并在查询完成并解决之后添加所有num_vendors字段。我该如何实现?这一定是一个相当普遍的情况,所以我确信石墨烯提供了一些实现此目的的钩子。

1 个答案:

答案 0 :(得分:1)

您可以使用计数字段定义 MarketConnection。

类似于:


class MarketConnection(graphene.relay.Connection):
    class Meta:
        node = Market

    market_count = graphene.Int(required=True)
    vendor_count = graphene.Int(required=True)

    def resolve_market_count(self, info, **kwargs):
        return self.iterable.count() if isinstance(self.iterable, QuerySet) else len(self.iterable)

    def resolve_vendor_count(self, info, **kwargs):
        if isinstance(self.iterable, QuerySet):
            return self.iterable.aggregate(Count("vendor"))
        return sum([market.num_vendors for market in self.iterable])

并将 connection_class 添加到您的 MarketNode

class MarketNode(DjangoObjectType):
   class Meta:
      model: Market
      connection_class: MarketConnection