我有一个模型queryset
,我需要使用prefetch_related
为O2M和M2M关系执行缓存。
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
类的引用,但这似乎与我的情况不符。
答案 0 :(得分:0)
好吧,由于Daniel Roseman消除了我的第二种想法,我最终使用了Model _meta.get_fields()
方法!
这是实现:
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
类型显然没有相关名称。