如何使用StringAgg或ArrayAgg从多个子行中连接一列来注释django查询集?

如何使用StringAgg或ArrayAgg从多个子行中连接一列来注释django查询集?,django,postgresql,annotate,django-aggregation,Django,Postgresql,Annotate,Django Aggregation,文档是父表。 段落是子表 用户根据各种搜索条件筛选文档。 然后,我希望用文本查询过滤的某些段落对文档进行注释。 相同的文本查询用于筛选文档并对其进行排序(SearchRank)。这种排名使得有必要从文档开始并用段落对其进行注释,而不是从段落开始并按文档对其进行分组 postgresql从段落中的多行连接一个文本字段的方法如下: SELECT array_to_string( ARRAY( SELECT paragraph.text FROM paragraph WHERE document id

文档是父表。 段落是子表

用户根据各种搜索条件筛选文档。 然后,我希望用文本查询过滤的某些段落对文档进行注释。 相同的文本查询用于筛选文档并对其进行排序(SearchRank)。这种排名使得有必要从文档开始并用段落对其进行注释,而不是从段落开始并按文档对其进行分组

postgresql从段落中的多行连接一个文本字段的方法如下:

SELECT array_to_string(
ARRAY(
SELECT paragraph.text
FROM paragraph
WHERE document id = '...'
ORDER BY paragraph.number),
', ');
我试图将其转换为django编码

我尝试了许多django方法,但都没有成功。 我可以给一段加注释。 Query_sum是根据用户输入构建的Q()对象

results = Documents.filter(Query_sum)

sub_paragraphs = Paragraphs.filter(Query_sum).filter(document=OuterRef('id'))

results = results.annotate(paragraphs=Subquery(sub_paragraphs.values('text')[:1], output_field=TextField()))
当我摆脱切片时,问题就开始了

results = results.annotate(paragraphs=Subquery(sub_paragraphs.values('text'), output_field=TextField()))
然后我得到以下错误: “由用作表达式的子查询返回的多行”

为了解决这个问题,我尝试使用ArrayAg和StringAgg。 我弄得一团糟;-)

Documents queryset(result)应使用相关段落列表(ArrayAg)或由任何分隔符(StringAgg)分隔的段落字符串进行注释


你知道怎么做吗?我将非常感谢

我们可以通过使用

然后,获取与我们使用的每个文档的查询相匹配的所有段落。我们可以使用对象来过滤预取操作

documents = documents.prefetch_related(Prefetch(
    'paragraphs',
    queryset=Paragraph.objects.filter(text__icontains=search_string),
    to_attrs='matching_paragraphs'
))

然后,您可以按排序顺序在文档上循环,它们将具有一个属性“matching_段落”,该属性包含所有匹配段落

我们可以使用与查询匹配的段落数对文档进行注释和排序

然后,获取与我们使用的每个文档的查询相匹配的所有段落。我们可以使用对象来过滤预取操作

documents = documents.prefetch_related(Prefetch(
    'paragraphs',
    queryset=Paragraph.objects.filter(text__icontains=search_string),
    to_attrs='matching_paragraphs'
))

然后,您可以按排序顺序在文档上循环,它们将具有一个属性“匹配_段落”它包含所有匹配的段落

要返回按与搜索匹配的文档相关的段落数排序的文档吗?要返回按与搜索匹配的文档相关的段落数排序的文档吗?我喜欢!简约之美。我不得不稍微调整预回迁,“段落集”而不是“段落”,以及“to_attr”而不是“to_attrs”。非常感谢!我喜欢!简约之美。我不得不稍微调整预回迁,“段落集”而不是“段落”,以及“to_attr”而不是“to_attrs”。非常感谢!