Das ganze arbeitet mit signals (post_save und pre_delete).
Nun hab ich die Idee, man könnte auch mitspeichern, wo im Code das Objekt geändert wurde. Also wo abschließend das save() ausgeführt wurde, im einem eigenen view oder im django admin panel...
Gibt es da eine einfache Möglichkeit?
"sender" sagt ja nur wie das Datebank Model heißt.
Versuche das ganze mit inspect.stack() zu machen war nicht sehr erfolgreich. In den Stack Daten ist zwar die richtige Codestelle drin, aber IMHO kann man nicht einfach feststellen welcher Eintrag im Stack der passende ist.
Hab versucht über den Dateinamen zu gehen und mir dazu das wirre Zeug zusammen gehackt:
Code: Alles auswählen
from django.db.models import get_apps, get_models
def get_entry_points():
result = []
known_packages = []
for app in get_apps():
for model in get_models(app):
class_path = repr(model).split("'")[1] # FIXME
package, obj_name = class_path.rsplit(".", 1)
if package not in known_packages:
known_packages.append(package)
model_class = __import__(
package, globals={}, locals={}, fromlist=[obj_name]
)
raw_file_path = model_class.__file__
file_path = os.path.splitext(raw_file_path)[0] + ".py"
result.append(file_path)
return result
STACK_ENTRY_POINTS = get_entry_points()
Edit: Mir ist da gerade noch etwas eingefallen: Man könnte evtl. im stack objekt in den locals nachsehen, ob die Klassen instanz vorhanden ist.
Naja, so richtig schön ist das auch nicht und ob es funktioniert, weiß ich nicht.