django rest框架使用ArrayAgg和GROUP BY进行注释

时间:2019-05-25 20:36:33

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

我想使用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)

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

我能够使用原始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)

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