使用分隔符 Django 连接外键字段

Concatenate foreign key fields with delimiter Django

假设我有 2 个具有外键关系的模型,用于捆绑书籍:

class Bundle(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    name = models.CharField(max_length=20)
    isbn = models.CharField(max_length=13)
    bundle = models.ForeignKey(Bundle)

我们将通过将 ISBN 编号与分隔符连接起来来识别捆绑包,如下所示:

123456788 & 123456789

要进一步导出可用捆绑包列表以供进一步处理,我们需要该编号。

我知道我可以使用:

for bundle in Bundle.objects.all():
    complex_isbn = ' & '.join(bundle.book_set.all().values_list('isbn', flat=True))

但这对于现实世界的目的来说太慢了。 有没有办法可以使用注释来完成此操作?如果是这样,如何?我正在努力寻找有关如何完成连接多个外键条目的文档。

您可以使用仅适用于 PostgreSQL 的 StringAgg aggregate function [Django-doc]。因此,您可以使用复杂的 ISBN 注释 Bundles:

from django.contrib.postgres.aggregates import <strong>StringAgg</strong>

Bundle.objects.annotate(
    <strong>complex_isbn=StringAgg('isbn', delimiter=' & ')</strong>
)

由此查询集产生的 Bundle 将具有一个额外的属性 .complex_isbn