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

Posted

技术标签:

【中文标题】聚合石墨烯/django 查询中的字段【英文标题】:Aggregating fields in graphene/django queries 【发布时间】:2020-08-11 14:15:49 【问题描述】:

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

这里有一些示例代码。 Django 模型类“市场”有一个整数字段“num_vendors”。石墨烯包装器是包装在“市场”模型类周围的“市场节点”:

模型类:

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】:

您可以使用其上的计数字段来定义 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

【讨论】:

以上是关于聚合石墨烯/django 查询中的字段的主要内容,如果未能解决你的问题,请参考以下文章

如何使用石墨烯-django 对多个字段中的图标使用 OR 条件

石墨烯突变返回 400 - 不会正确传递 id 字段

如何解决具有多对多关系的石墨烯 django 节点字段

Django 石墨烯中继限制对用户拥有的对象的查询

将 json 模型字段与 django 石墨烯一起使用

如何允许石墨烯GraphQl中的任何字段过滤