来自其他查询集的django查询集manytomany

django queryset from other's queryset manytomany

将 ManyToMany 中的所有记录放入查询集中的最有效方法是什么?

举个例子,如果我有一个名为 Events 的模型,它有一个名为 Items 的模型的 ManyToMany,并且我有一个包含 Events 的查询集。如何获取包含查询集中所有 Events 指向的所有 Items 的查询集?

如果是单个事件,则为:Events.items.all()。但这是一个查询集,所以我不能这样做。

谢谢

Django 有一个 prefetch_related 用于最小化获取相关对象的数据库命中数:

This allows it to prefetch many-to-many and many-to-one objects, which cannot be done using select_related, in addition to the foreign key and one-to-one relationships that are supported by select_related.

您的查询将是:

events = events.objects.all().prefetch_related('items')

以及相关对象:

items = [e.items.all() for e in events]

如果 event 是单个对象,它将看起来:

event = events.objects.get(id=id).prefetch_related('items')
# items related to that event
items = event.items.all()

Items.filter(event_set__in=some_events_qs) 就可以了。这使用延迟评估的嵌套查询 - 但请参阅性能注意事项 noted in the docs

如果 Item 属于初始查询集中的多个事件,这可能 return 会被欺骗,我永远不记得它是如何工作的。如果是这样,.distinct() 会清理它,但也会对性能产生影响。