【问题标题】:Concatenate foreign key fields with delimiter Django用分隔符 Django 连接外键字段
【发布时间】:2021-12-27 11:48:47
【问题描述】:

假设我有 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))

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

【问题讨论】:

  • 你使用什么数据库?
  • @WillemVanOnsem Postgres

标签: django postgresql django-queryset django-annotate django-aggregation


【解决方案1】:

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

from django.contrib.postgres.aggregates import StringAgg

Bundle.objects.annotate(
    complex_isbn=StringAgg('isbn', delimiter=' & ')
)

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

【讨论】:

  • 谢谢!喜欢魅力!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 2010-10-09
  • 2015-09-26
  • 2013-03-01
  • 2016-06-04
  • 1970-01-01
相关资源
最近更新 更多