gpt4 book ai didi

带有 OuterRef 的 Django 子查询和注释

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

我在使用 annotate() 时遇到问题 OuterRef在 Django 1.11 子查询中。示例模型:

class A(models.Model):
name = models.CharField(max_length=50)


class B(models.Model):
a = models.ForeignKey(A)

现在一个带有子查询的查询(这没有任何意义,但说明了我的问题):
A.objects.all().annotate(
s=Subquery(
B.objects.all().annotate(
n=OuterRef('name')
).values('n')[:1],
output_field=CharField()
)
)

这给出了以下错误:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "myapp/models.py", line 25, in a
n=OuterRef('name')
File ".virtualenv/lib/python2.7/site-packages/django/db/models/query.py", line 948, in annotate
if alias in annotations and annotation.contains_aggregate:
AttributeError: 'ResolvedOuterRef' object has no attribute 'contains_aggregate'

是否无法基于 OuterRef 注释子查询?

更新 #1

找到了一个解决方法,可以让我现在继续前进,但这并不好。
class RawCol(Expression):

def __init__(self, model, field_name, output_field=None):
field = model._meta.get_field(field_name)
self.table = model._meta.db_table
self.column = field.column
super().__init__(output_field=output_field)

def as_sql(self, compiler, connection):
sql = f'"{self.table}"."{self.column}"'
return sql, []

OuterRef使用自定义表达式
A.objects.all().annotate(
s=Subquery(
B.objects.all().annotate(
n=RawCol(A, 'name')
).values('n')[:1],
output_field=CharField()
)
)

产量
SELECT "myapp_a"."id",
"myapp_a"."name",

(SELECT "myapp_a"."name" AS "n"
FROM "myapp_b" U0 LIMIT 1) AS "s"
FROM "myapp_a"

最佳答案

这是 Django 中的一个已知错误,已在 3.0 中修复。
https://code.djangoproject.com/ticket/28621为讨论。
如果您像我一样需要注释该字段以便可以在以下子查询中使用它,请记住您可以堆叠 OuterRef喜欢:


id__in=SubQuery(
MyModel.objects.filter(
field=OuterRef(OuterRef(some_outer_field))
)
)

关于带有 OuterRef 的 Django 子查询和注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47094982/

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