Я хочу предупредить или запретить пользователю удалять экземпляр объекта, на который ссылаются другие экземпляры. Есть ли хороший способ сделать это?
Один из способов - получить список моделей, которые включают референт, а затем попробовать обратный поиск на них. Есть ли способ получить этот список моделей? Или есть лучший способ?
При исследовании предложения коллекционера я нашел некоторую связанную информацию и написал следующее, которое обнаруживает классы, у которых референт является внешним ключом:
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