gpt4 book ai didi

django - 在 Django ORM 的子查询中返回多个值

转载 作者:行者123 更新时间:2023-12-04 14:12:47 26 4
gpt4 key购买 nike

问题是关于 SubqueryArrayAgg在 Django ORM 中。
例如,我有 2 个模型,彼此之间没有任何关系:


class Example1(models.Model):
ident = Integerfield()

class Example2(models.Model):
ident = IntegerField()
email = EmailField()
FK、M2M、O2O等2种模式之间没有联系,而是现场 ident在两种模型中可能是相同的整数(这在某种程度上是一种连接)并且通常对于 Example1 的 1 个实例 Example2 有多个实例同 ident .
我想做一个 subqueryarrayagg (db Postgres) 或 RAWSQL 之外的任何方式来进行这样的注释:
Example1.objects.annotate(
cls2=Subquery(
Example2.objects.filter(
ident=OuterRef(‘ident’
).values_list(‘email’, flat=True).

#or

Example1.objects.annotate(
cls2=StringAgg(
something here???,
delimeter=’, ‘,
distinct=True,)

当然这不能作为 Subquery 起作用返回多行,似乎无法使用 StringAgg因为我们在模型之间没有任何联系(没有东西可以放在 StringAgg 里面)。
任何如何注释的想法 Example1来自 Example2 的电子邮件在一个查询集中?
这将用于 CASE 表达式。
谢谢...

最佳答案

对于 MySQL 后端,您可以使用 django-mysql 的 GroupConcat ,或查看 the post自己做一个聚合函数:

from django_mysql.models import GroupConcat
Example1.objects.annotate(
cls2=Subquery(
Example2.objects.filter(ident=OuterRef('ident')).values('ident')\
.annotate(emails=GroupConcat('email')).values('emails')
)
)
对于 PostgreSQL 后端,您可以使用 ArrayAgg or StringAgg :
from django.contrib.postgres.aggregates import ArrayAgg, StringAgg
Example1.objects.annotate(
cls2=Subquery(
Example2.objects.filter(ident=OuterRef('ident')).values('ident')\
.annotate(emails=ArrayAgg('email')).values('emails')
)
)
# or
Example1.objects.annotate(
cls2=Subquery(
Example2.objects.filter(ident=OuterRef('ident')).values('ident')\
.annotate(emails=StringAgg('email', ',')).values('emails')
)
)

关于django - 在 Django ORM 的子查询中返回多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63020407/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com