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, это может сэкономить вам много кодов.