You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Django ORM筛选多对多关系中含指定多用户的对象

用Django ORM找出两个用户共同参与的活动

嘿,很高兴能帮你用Django ORM来解决这个问题——不用写原生SQL也能轻松找出两个用户共同参与的活动!

首先先确认你的模型定义(和你给出的一致):

from django.contrib.auth.models import User
from django.db import models

class Activity(models.Model):
    participants = models.ManyToManyField(User, related_name='activity_participants')

下面提供几种简洁的实现方式:

方法一:链式Filter(最直观)

假设你已经获取了两个目标用户的实例(比如通过ID查询),可以通过两次链式筛选来得到结果:

# 获取两个用户对象
user1 = User.objects.get(id=1)
user2 = User.objects.get(id=2)

# 筛选同时包含user1和user2的活动
common_activities = Activity.objects.filter(participants=user1).filter(participants=user2)

这个逻辑很简单:先找出所有user1参与的活动,再从这个结果里筛选出同时包含user2的活动,最终得到的就是两者共同参与的活动列表。

方法二:使用Q对象(适合复杂条件组合)

如果之后需要添加更多筛选条件,用Q对象组合查询会更灵活:

from django.db.models import Q

user1 = User.objects.get(id=1)
user2 = User.objects.get(id=2)

common_activities = Activity.objects.filter(Q(participants=user1) & Q(participants=user2))

这个实现和链式Filter的效果完全一致,只是写法更适合多条件的场景。

方法三:直接通过用户ID筛选

如果你只有用户ID而没有实例,也可以直接用ID进行筛选:

common_activities = Activity.objects.filter(participants__id=1).filter(participants__id=2)

补充说明

Django ORM会自动帮你处理多对多关联的表连接,生成的SQL逻辑和你手写的原生查询是一致的(比如会生成两次内连接来匹配两个用户的参与记录),而且不用硬编码表名,更符合Django的最佳实践。

内容的提问来源于stack exchange,提问作者drakenation

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:34:30