示例模型
class A(models.Model):
id = models.CharField(max_length=255, primary_key=True, default=make_uuid, editable=False)
b = models.IntegerField()目标
我需要得到包含id、b和same_b_total的列表。
例如,以下quetyset返回:
a = list(models.Cell.objects.all().values("b").annotate(same_b_total=Count("b")))
print(a) # [{"b": 1, "same_b_total": 5}, {"b": 2, "same_b_total": 3}]当我将id添加到.values("b", "id")中时,它将返回带有以下数据的列表
[{'b': 1, 'id': '<some uuid>', 'same_b_total': 1}, {'b': 1, 'id': '<some uuid2>', 'same_b_total': 1}, {'b': 2, 'id': '<some uuid3>', 'same_b_total': 1}, ...]如何更改查询以接收每个记录的正确的same_b_total ?如下:
[{'b': 1, 'id': '<some uuid>', 'same_b_total': 5}, {'b': 1, 'id': '<some uuid2>', 'same_b_total': 5}, {'b': 2, 'id': '<some uuid3>', 'same_b_total': 3}, ...]表例:
id(Uuid)\b
uuid-1 \x{e76f}
uuid-2 -1
uuid-3 -2
uuid-4 -1
uuid-5 -1
uuid-6 -1
uuid-7 -2
uuid-8 -2
发布于 2020-04-08 17:43:23
解释
使用OuterRef和Subquery的组合是您所要寻找的。对于b字段的特定整数值,需要获取所有现有行的计数。通过用OuterRef('b')替换特定的整数值,结果将转换为子查询。(而不是普通的查询集)
注意,sub是一个子查询,它本身并不存在。
sub = A.objects.filter(b=OuterRef('b')).values('b').annotate(same_b_count=Count('id'))我们需要将sub注入到另一个查询中。从姜戈博士获得一些关于Subquery和Outerref组合的帮助,结果是:
A.objects.annotate(same_b_count=Subquery(sub.values('same_b_count'))).values('id', 'b', 'same_b_count')结论
将解释中的两个片段组合起来:
sub = A.objects.filter(b=OuterRef('b')).values('b').annotate(same_b_count=Count('id'))
A.objects.annotate(same_b_count=Subquery(sub.values('same_b_count'))).values('id', 'b', 'same_b_count')将产生下列产出:
<QuerySet [{'id': 1, 'b': 1, 'same_b_count': 3}, {'id': 2, 'b': 1, 'same_b_count': 3}, {'id': 3, 'b': 1, 'same_b_count': 3}, {'id': 4, 'b': 3, 'same_b_count': 1}, {'id': 5, 'b': 4, 'same_b_count': 2}, {'id': 6, 'b': 4, 'same_b_count': 2}, {'id': 7, 'b': 6, 'same_b_count': 1}]>https://stackoverflow.com/questions/61105935
复制相似问题