gpt4 book ai didi

sql - Django - 带有 Prefetch 对象的多个注释

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

我有一个模型 test带两个平方米 字段:foobar .

我正在尝试注释这些相关字段的条件计数,即计算满足特定条件的相关对象。在查询集之外检索此信息不是一种选择,因为我需要使用带注释的字段来对结果进行排序。

我尝试了以下方法:

1. 使用 Prefetch 对象

from django.db.models import Prefetch, Count

prefetch_foo = Prefetch('foo_set', queryset=foo.objects.filter(<some condition>))
prefetch_bar = Prefetch('bar_set', queryset=bar.objects.filter(<some condition>))
result = test.objects.prefetch_related(prefetch_foo, prefetch_bar).annotate(n_foo=Count('foo'), n_bar=Count('bar'))

这不起作用,因为 prefetch_relatedannotate 之后应用.

2. 使用条件表达式
from django.db.models import Sum, Case, When
from django.db.models.fields import IntegerField

foo_sum = Sum(Case(When(foo__<some condition>, then=1), default=0,
output_field=IntegerField())))
bar_sum = Sum(Case(When(bar__<some condition>, then=1), default=0,
output_field=IntegerField())))
result = test.objects.annotate(n_foo=foo_sum, n_bar=bar_sum)

由于多个 Sum 上的此错误,这不起作用注释: https://code.djangoproject.com/ticket/10060

3. 使用 RawSQL
sql = "SELECT SUM(CASE WHEN foo.<condition> "
"THEN 1 ELSE 0 END) FROM app_test "
"LEFT OUTER JOIN app_foo "
"ON (app_test.id = foo.test_id) "
"GROUP BY test.id"
result = test.objects.annotate(n_foo=RawSQL(sql, []))
# Same method for bar

我被困在这里,因为这会检索 SUM对于所有行,我找不到添加类似 "WHERE test.id = <ID of the object the annotation corresponds to>" 的方法.

有没有办法从自定义 SQL 中获取正确的单行?还是另一种解决方法?

最佳答案

Count Django 中的函数现在有一个 filter应该是您要查找的参数。

See documentation .

在这种情况下:

result = test.objects.annotate(n_foo=Count('foo_set', filter=Q(<some condition>)), n_bar=Count('bar_set', filter=Q(<some condition)))

应该给出预期的结果。

关于sql - Django - 带有 Prefetch 对象的多个注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38885710/

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