【问题标题】:django rest framework annotate with ArrayAgg and GROUP BYdjango rest 框架使用 ArrayAgg 和 GROUP BY 进行注释
【发布时间】:2019-05-25 20:36:32
【问题描述】:

我想使用 django postgres 函数 ArrayAgg,但我也想将它与 GROUP BY 一起使用。 sql 真的很容易写,但我无法让它与 ORM 或原始 sql 一起工作

SELECT field1, ARRAY_AGG(field2)
FROM table1
GROUP BY field1

使用 orm,我认为这样的事情可能会起作用

subquery = Subquery(
           models.Model1.objects
           .filter(field1=OuterRef('field1'))
           .values('field2')
           .aggregate(field3=ArrayAgg('field2'))
           .values('field3')
)
queryset = queryset.annotate(field3=subquery)

但它没有外部引用错误(我尝试了很多排列)

通过原始查询,我可以让它工作,但是它会返回我猜测的所有字段,因为 RawQueryset 和 defer 之类的东西不起作用,所以所有字段都被查询并返回。

rawqueryset = models.Model1.objects.raw(
    'SELECT m.id, t.field1, t.field3 '
    'FROM ('
        'SELECT field1, array_agg(field2) as field3 '
        'FROM app_table1 '
        'GROUP BY frame_id '
    ') t LEFT OUTER JOIN app_table m ON m.field1 = t.frame_id',
    []
)
serializer = serializers.Model1(rawqueryset, many=True)
return Response(serializer.data)

有没有办法做到这一点?

【问题讨论】:

    标签: python django django-models django-rest-framework django-views


    【解决方案1】:

    我能够使用原始 sql 让它工作

    rawqueryset = models.Model1.objects.raw(
        'SELECT m.id, t.field1, t.field3 '
        'FROM ('
            'SELECT field1, array_agg(field2) as field3 '
            'FROM app_table1 '
            'GROUP BY frame_id '
        ') t LEFT OUTER JOIN app_table m ON m.field1 = t.frame_id',
        []
    )
    serializer = serializers.Model1(rawqueryset, many=True, context={'request': request})
    return Response(serializer.data)
    

    缺少的是将请求对象添加到传递的上下文中。

    【讨论】:

      猜你喜欢
      • 2021-10-23
      • 2021-06-05
      • 2018-02-21
      • 1970-01-01
      • 2015-07-02
      • 2017-08-17
      • 2021-06-09
      • 1970-01-01
      • 2018-10-04
      相关资源
      最近更新 更多