Django的:访问模型的`related_name`值及其所有相关型号

问题描述 投票:0回答:1

我有我需要为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.lookupsLookup类,但它似乎不适合我的情况。

python django django-orm
1个回答
0
投票

好吧,我结束了使用的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类型显然不具备相关的名字。

© www.soinside.com 2019 - 2024. All rights reserved.