Question
How can I get a list of all the model objects that have a ForeignKey pointing to an object? (Something like the delete confirmation page in the Django admin before DELETE CASCADE).
I'm trying to come up with a generic way of merging duplicate objects in the database. Basically I want all of the objects that have ForeignKeys points to object "B" to be updated to point to object "A" so I can then delete "B" without losing anything important.
Thanks for your help!
Answer
Django <= 1.7
This gives you the property names for all related objects:
links = [rel.get_accessor_name() for rel in a._meta.get_all_related_objects()]
You can then use something like this to get all related objects:
for link in links:
objects = getattr(a, link).all()
for object in objects:
# do something with related object instance
I spent a while trying to figure this out so I could implement a kind of "Observer Pattern" on one of my models. Hope it's helpful.
Django 1.8+
Use _meta.get_fields()
:
https://docs.djangoproject.com/en/1.10/ref/models/meta/#django.db.models.options.Options.get_fields
(see reverse in the _get_fields()
source also)