我有一个定义如下的Django模型:
class Session(models.Model):
...
leader = models.ForeignKey(User, related_name='leader')
follower = models.ForeignKey(User, related_name='follower')
...
现在假设我有一个Session
对象的QuerySet:
some_sessions = Session.objects.filter(some_criteria=True)
在User
的任何会话中,如何简单计数唯一的leader
是follower
还是some_sessions
?
例如,特定的User
在某些leader
对象中可能是Session
,但是在少数其他follower
中却是Session
对象。该特定的User
仅应为所需的唯一User
计数贡献1。
当然有一些幼稚的解决方案,但是出于性能原因,我想知道是否有一种解决方案,如果可能的话,可以更多地利用QuerySets的功能。
编辑:为澄清起见,这是一个天真的方法,可以提供我需要的结果:
active_user_ids = set()
some_sessions = Session.objects.filter(some_criteria=True)
for session in some_sessions:
active_user_ids.add(session.leader.id)
active_user_ids.add(session.follower.id)
all_active_users = User.objects.filter(id__in=active_user_ids).count()
答案 0 :(得分:1)
一种明智的做法是查询User
而不是Session
。了解更多here。
from django.db.models import Q
# ... Other import here
users = User.objects.all(Q(leader__isnull=False) | Q(follower__isnull=False),).distinct()
这将为您提供任何相关关系leader/follower
为空的用户。
如果您要基于sessions
值添加一些过滤器,则可以执行以下操作:
sessions = Session.objects.filter(**your_filters)
users = User.objects.all(
Q(leader__in=sessions) | Q(follower__in=sessions),).distinct()
答案 1 :(得分:0)
要获取唯一用户的简单计数,请使用count
方法。
active_user_ids = set()
all_sessions = Session.objects.all()
for session in all_sessions:
active_user_ids.add(session.leader.id)
active_user_ids.add(session.follower.id)
all_active_users = User.objects.filter(id__in=active_user_ids).count()