所以我的模特:
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案例,当事情没有任何帮助时。
答案 0 :(得分:0)
我建议你改变你的数据库设计。您有包含部分空条目和重复的行。这并不好。如果预计这个项目会增长,将来可能会遇到问题。
例如:Group -> User
和ActiveGroup.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