Джанго: Как я могу найти, какая из моих моделей относится к модели - PullRequest
10 голосов
/ 24 сентября 2011

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

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

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

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 Ответ

3 голосов
/ 24 сентября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...