Django:如何聚合/注释多对多关系?

发布于 2024-09-16 10:16:25 字数 198 浏览 4 评论 0原文

我有一个 Person 模型和一个 Tag 模型,它们之间有一个 m2m。

我需要提取与给定人员查询集中最多记录相关的标签以及计数。

有没有一种优雅、有效的方法来使用 Django ORM 提取它?

更好的是,有没有办法通过一些注释来获取整个标签分布?如何才能拉出连接到通过 m2m 连接的对象子集的所有对象?

谢谢!

I have a Person model and a Tag model, with a m2m between them.

I need to extract the tag which is connected to the most records within a given Person queryset, together with the count.

Is there an elegant, efficient way to extract this using the Django ORM?

Better yet, is there a way to get the entire tag distribution through some annotation? How can one even pull all of the objects connected to a subset of objects connected via a m2m?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

海的爱人是光 2024-09-23 10:16:25

这将为您提供最常见的标签:

from django.db.models import Count
Tag.objects.filter(person__yourcriterahere=whatever [, morecriteria]).annotate(cnt=Count('person')).order_by('-cnt')[0]

This would give you the most frequent tag:

from django.db.models import Count
Tag.objects.filter(person__yourcriterahere=whatever [, morecriteria]).annotate(cnt=Count('person')).order_by('-cnt')[0]
丶情人眼里出诗心の 2024-09-23 10:16:25

我需要提取与给定人员查询集中最多记录相关的标签以及计数。

我以前遇到过类似的问题。在我的例子中,m2m 关系是在 UnitWeapon 模型之间定义的。我使用以下查询来找出每个 Unit 使用的武器数量,并按武器数量的降序对它们进行排序。

from django.db.models import Count
q = Unit.objects.all().annotate(count = Count('weapons')).order_by('-count')

我会根据您的要求调整查询:

q = User.objects.all().annotate(count = Count('tag')).order_by('-count')

I need to extract the tag which is connected to the most records within a given Person queryset, together with the count.

I faced a similar problem before. In my case the m2m relationship was defined between Unit and Weapon models. I used the following query to find out the number of weapons used by each Unit and sort them in descending order of number of weapons.

from django.db.models import Count
q = Unit.objects.all().annotate(count = Count('weapons')).order_by('-count')

I would adjust the query for your requirement thus:

q = User.objects.all().annotate(count = Count('tag')).order_by('-count')
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文