过滤两个ManyToMany字段

时间:2014-06-03 21:10:46

标签: mysql django orm

我有User模型和Event模型。我对两者都有以下内容:

class Event(models.Model):
    ...
    timestamp = models.DateTimeField()
    organization_map = models.ManyToManyField(Organization)

class User(AuthUser):
    ...
    subscribed_orgs = models.ManyToManyField('Organization')

我想查找在特定时间范围内创建的所有事件,并找到订阅这些组织的用户。我知道如何为此编写SQL(这很容易),但是使用Django ORM的pythonic方式是什么?

我正按以下方式尝试:

orgs = Organization.objects.all()
events = Event.objects.filter(timestamp__gt=min_time) # Min time is the time I want to start from
events = events.filter(organization_map__in=orgs)

但是,从那里,我如何映射到具有organization作为订阅的用户?

我正试图像这样映射:

users = User.objects.filter(subscribed_orgs__in=...

1 个答案:

答案 0 :(得分:1)

Django可以同时连接多个表,因此您应该能够一步完成users查询:

events = Event.objects.filter(timestamp__gt=min_time)
users = User.objects.filter(subscribed_orgs__event__in=events).distinct()

distinct()是必要的,因为用户可以通过多种方式进行匹配。)

既然你知道你正在寻找的SQL,你总是可以检查Django生成的SQL,看它是否符合你的直觉。查看Django Debug Toolbar或直接使用connection.queries