来自其他查询集的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()
会清理它,但也会对性能产生影响。
将 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 byselect_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()
会清理它,但也会对性能产生影响。