我有我需要为O2M和M2M关系进行缓存,使用queryset
模型prefetch_related
。
这同样适用于O2O关系,因此使用select_related
。
我想这样做,作为一个通用的实施,我会找到相关模型的所有related_name
值并解压缩这样的:
def cache_related():
related_names = [...] # the related_name values for the prefetchable related models
cached_queryset = queryset.prefetch_related(*related_names)
return cached_queryset
我目前使用访问这些值:
related_models = deepcopy(queryset.model._meta.related_objects)
related_names = [m.related_name for m in related_models]
问题是,我真的不希望直接访问受保护的_meta
值。
是否有在Django一个实用工具,返回一个模型的O2O,O2M和M2M关系的所有related_name
值的列表?
我发现引用django.db.models.lookups
和Lookup
类,但它似乎不适合我的情况。
好吧,我结束了使用的Model _meta.get_fields()
方法,这要归功于Daniel Roseman解雇我一下第二个想法!
这里的实现:
related_names = [
f.name for f in queryset.model._meta.get_fields()
if f.get_internal_type() in ['ForeignKey', 'ManyToManyField', 'OneToOneField']
]
我去field.name
代替field.related_name
,因为ForeignKey
类型显然不具备相关的名字。