使用分隔符 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 注释 Bundle
s:
from django.contrib.postgres.aggregates import <strong>StringAgg</strong>
Bundle.objects.annotate(
<strong>complex_isbn=StringAgg('isbn', delimiter=' & ')</strong>
)
由此查询集产生的 Bundle
将具有一个额外的属性 .complex_isbn
。
假设我有 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 注释 Bundle
s:
from django.contrib.postgres.aggregates import <strong>StringAgg</strong>
Bundle.objects.annotate(
<strong>complex_isbn=StringAgg('isbn', delimiter=' & ')</strong>
)
由此查询集产生的 Bundle
将具有一个额外的属性 .complex_isbn
。