如何在 Django 中跨双 M2M 进行查询?

How to query across a double M2M in Django?

考虑以下无用的示例。我们有小部件,Collection 小部件和用户,每个都由 M2M 链接。一个 Widget 可以属于多个 Collection。每个用户可以订阅多个Collection.

class Widget(models.Model):
    pass

class WidgetCollection(models.Model):
    widgets = models.ManyToManyField('Widget')

class User(models.Model):
    collections = models.ManyToManyField('WidgetCollection')

对于任何给定的用户,我想列出小部件。我可以通过 M2M 循环,但这真的很松弛。我可以让 Django 从数据库中生成一个 Widget 列表吗?

你想要的是反向查找:https://docs.djangoproject.com/en/1.7/topics/db/queries/:

To refer to a “reverse” relationship, just use the lowercase name of the model.

由于您想要一个小部件列表,请从该模型开始:

fredsWidgets = Widget.objects.filter(widgetcollection__user=fred)

应该可以了。