Django:为其所有相关模型访问模型的“ related_name”值

时间:2019-02-08 16:46:27

标签: python django django-orm

我有一个模型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.lookupsLookup类的引用,但这似乎与我的情况不符。

1 个答案:

答案 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类型显然没有相关名称。