Django,m2m计数与条件相关的注释相关模型

时间:2017-04-05 12:51:47

标签: django count annotations django-queryset m2m

所以我的模特:

class User(models.Model):
    username = models.CharField(max_lenght=255)

class Group(models.Model):
    users = models.ManyToManyField('User')

class ActiveGroup(models.Model):
    group = models.ForeignKey('Group', null=True, blank=True, default=None)
    user = models.OneToOneField('User')

因此,交易是每个用户都可以成为任何组的成员(由组模型上的m2m字段表示)。但是可以同时只在其中一个中成为活动成员(这就是为什么在activegroup模型上的oneToOneField关系)。

问题:需要为具有活动用户数的Group模型创建一个查询集。 所以它假设就像

SELECT group.id, COUNT(
    SELECT COUNT(*) FROM activegroup WHERE activegroup.group_id = group.group.id
) as users_count FROM group.

我已经尝试过django.db.models案例,当事情没有任何帮助时。

1 个答案:

答案 0 :(得分:0)

我建议你改变你的数据库设计。您有包含部分空条目和重复的行。这并不好。如果预计这个项目会增长,将来可能会遇到问题。

例如:Group -> UserActiveGroup.group -> user。存储两次的信息相同。我要在投入生产之前改变它。我的建议是通过:

https://docs.djangoproject.com/en/1.10/topics/db/models/#extra-fields-on-many-to-many-relationships

你可以创建一个名为“active”的布尔字段,并在每次更改活动组时简单地切换它。

但当然,这些只是建议。 :)

您的解决方案是:

Group.objects.annotate(total=Count('activegroup__user'))

ag = Group.objects.annotate(total=Count('activegroup__user'))
for g in ag:
    print(g, g.total)

>> group_1 2
   group_2 1

在您的模型中,您可能会面对另一个名为null的群组,该群组将成为没有群组的用户。

https://docs.djangoproject.com/en/1.10/ref/models/querysets/#annotate