Django: Как я могу найти, какие из моих моделей относятся к модели

Я хочу предупредить или запретить пользователю удалять экземпляр объекта, на который ссылаются другие экземпляры. Есть ли хороший способ сделать это?

Один из способов - получить список моделей, которые включают референт, а затем попробовать обратный поиск на них. Есть ли способ получить этот список моделей? Или есть лучший способ?

При исследовании предложения коллекционера я нашел некоторую связанную информацию и написал следующее, которое обнаруживает классы, у которых референт является внешним ключом:

def find_related(cl, app):
    """Find all classes which are related to the class cl (in app) by 
    having it as a foreign key."""

    from django.db import models

    all_models = models.get_models()
    ci_model = models.get_model(app, cl)
    for a_model in all_models:
        for f in a_model._meta.fields:
            if isinstance(f, ForeignKey) and (f.rel.to == ci_model):
                print a_model.__name__

Основываясь на предположении использовать код для сбора:

def find_related(instance):
"""Find all objects which are related to instance."""

for related in instance._meta.get_all_related_objects():
    acc_name = related.get_accessor_name()
    referers = getattr(instance, acc_name).all()
    if referers:
        print related

Ответ 1

В Django есть класс Collector. Он используется Django при выполнении удаления модели. То, что это делает, похоже на то, что вы хотите. Вызывая collect(), он находит все ссылки на объект в графике модели. Кроме того, он предлагает способ удаления всех найденных объектов с помощью вызова delete().

Это говорит, что я никогда не использовал этот класс сам, я просто знаю, что он существует. API несколько запутан, но если вы захотите немного вникнуть в внутренности Django, это может сэкономить вам много кодов.