复杂的Django查询集过滤,包括Q对象和复杂的logi

2024-10-06 14:21:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个在Django开发的基于web的聊天应用程序。人们可以在里面组成自己的聊天小组,邀请其他人,在上面聊天。在

我想隔离最近在线的所有用户:(I)已经收到某个群组的邀请,或者(ii)已经在同一个群组中至少参与过一次(即,回复了)。注意,user是一个普通的django.contrib.authuser。在

为了达到这个目的,我写了:

online_invited_replied_users = User.objects.filter(id__in=recently_online,(Q()|Q()))

假设recently_online公式正确。这两个Q对象应该是什么?在

第一个Q()应该指invitees,第二个应该指向至少回复过一次的用户。在这里,我似乎遇到了编写代码的障碍,无法在这里建立一个全面、高效的数据库查询。请指教!在


相关车型有:

^{pr2}$

注意:请随意询问更多信息;我知道我可能遗漏了一些内容。


Tags: django用户目的web应用程序小组contribonline
1条回答
网友
1楼 · 发布于 2024-10-06 14:21:05

对于已被邀请加入组group的用户,请向后按GroupInvite.invitee外键。在

already_invited = Q(invitee__which_group=group)

您选择的相关名称invitee,实际上没有意义,因为它链接到的是组邀请,而不是用户。也许“群组邀请”会更好。在

对于已经回复的用户,请向后按Reply.writer外键。在

^{pr2}$

在本例中是reply。因为你还没有指定一个相关的名字。在

请注意,您当前的伪代码

User.objects.filter(id__in=recently_online,(Q()|Q()))

将给出错误“关键字arg后的非关键字arg”。在

可以通过将非关键字参数移到关键字参数之前来解决此问题

User.objects.filter((Q()|Q()), id__in=recently_online)

或者把它们放在单独的过滤器中:

User.objects.filter(id__in=recently_online).filter(Q()|Q())

最后,请注意,您可能需要在查询集中使用distinct(),否则用户可能会出现两次。在

相关问题 更多 >