根据另一个Django模型的多个字段检索唯一Django对象的数量

时间:2019-11-19 06:03:39

标签: python django django-queryset

我有一个定义如下的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的任何会话中,如何简单计数唯一的leaderfollower还是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()

2 个答案:

答案 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()