Me gustaría advertir o evitar que un usuario elimine una instancia de objeto a la que hacen referencia otras instancias. ¿Hay una buena manera de hacer esto?Django: ¿Cómo puedo encontrar cuál de mis modelos se refiere a un modelo?
Una forma sería obtener una lista de modelos que incluyen el referente y luego intentar búsquedas inversas en ellos. ¿Hay alguna manera de obtener esa lista de modelos? ¿O hay un mejor camino?
Mientras investiga la sugerencia colector, me encontré con algo de información relacionada y escribió lo siguiente que encuentra las clases que tienen el referente como una clave externa:
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__
Sobre la base de la sugerencia de usar el código de cobro revertido:
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
Gracias por actualizar esta pregunta con su solución final. Excelente trabajo. – Spike
Tiene 'find_related' tomando' (cl, app) ', mientras' get_model' toma '(app, cl)'. ¡Es realmente confuso! Además, si alguien más está leyendo esto, 'cl' y' app' son cadenas, ¡no pases los objetos! – Casebash