Django: доступ к значениям `related_name` модели для всех связанных с ней моделей - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть модель queryset, для которой мне нужно выполнить кэширование для отношений O2M и M2M, используя 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 утилита, которая возвращает список всех related_nameзначения отношений модели O2O, O2M и M2M?

Я нашел ссылки на django.db.models.lookups и класс Lookup, но, похоже, он не подходит для моего случая.

1 Ответ

0 голосов
/ 09 февраля 2019

Хорошо, я закончил тем, что использовал метод 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 явно не имеют связанных имен.

...