我想使用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)
有没有办法做到这一点?
答案 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)
缺少的是将请求对象添加到传递的上下文中。