首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用django模型的几个“值”查询中添加“注释”数据?

如何在使用django模型的几个“值”查询中添加“注释”数据?
EN

Stack Overflow用户
提问于 2020-04-08 16:55:49
回答 1查看 109关注 0票数 1

示例模型

代码语言:javascript
复制
class A(models.Model):
    id = models.CharField(max_length=255, primary_key=True, default=make_uuid, editable=False)
    b = models.IntegerField()

目标

我需要得到包含idbsame_b_total的列表。

例如,以下quetyset返回:

代码语言:javascript
复制
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")中时,它将返回带有以下数据的列表

代码语言:javascript
复制
[{'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 ?如下:

代码语言:javascript
复制
[{'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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-08 17:43:23

解释

使用OuterRefSubquery的组合是您所要寻找的。对于b字段的特定整数值,需要获取所有现有行的计数。通过用OuterRef('b')替换特定的整数值,结果将转换为子查询。(而不是普通的查询集)

注意,sub是一个子查询,它本身并不存在。

代码语言:javascript
复制
sub = A.objects.filter(b=OuterRef('b')).values('b').annotate(same_b_count=Count('id'))

我们需要将sub注入到另一个查询中。从姜戈博士获得一些关于SubqueryOuterref组合的帮助,结果是:

代码语言:javascript
复制
A.objects.annotate(same_b_count=Subquery(sub.values('same_b_count'))).values('id', 'b', 'same_b_count')

结论

将解释中的两个片段组合起来:

代码语言:javascript
复制
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')

将产生下列产出:

代码语言:javascript
复制
<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}]>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61105935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档