首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在石墨烯/django查询中聚合字段

在石墨烯/django查询中聚合字段
EN

Stack Overflow用户
提问于 2020-04-28 05:32:23
回答 1查看 1K关注 0票数 3

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

下面是一些示例代码。Django模型类'Market‘有一个整型字段'num_vendors’。Graphene包装器是'MarketNode‘,它包装了'Market’模型类:

模型类:

代码语言:javascript
复制
class Market(models.Model):
       num_vendors = models.IntegerField(....)

石墨烯类:

代码语言:javascript
复制
class MarketNode(DjangoObjectType):
   Meta:
      model: Market

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

代码语言:javascript
复制
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字段。我如何才能做到这一点?这肯定是一个相当常见的用例,所以我确信石墨烯提供了一些钩子来实现这一点。

EN

回答 1

Stack Overflow用户

发布于 2021-01-23 21:39:42

您可以使用count字段来定义MarketConnection。

类似于:

代码语言:javascript
复制
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])

并向您的MarketNode添加connection_class

代码语言:javascript
复制
class MarketNode(DjangoObjectType):
   class Meta:
      model: Market
      connection_class: MarketConnection
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61468812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档