Wie kann ich eine Liste aller Modellobjekte abrufen, bei denen ein ForeignKey auf ein Objekt verweist? (So etwas wie die Löschbestätigungsseite im Django-Administrator vor DELETE CASCADE).
Ich versuche, eine generische Methode zum Zusammenführen doppelter Objekte in der Datenbank zu finden. Grundsätzlich möchte ich, dass alle Objekte, die ForeignKeys-Punkte auf Objekt "B" haben, aktualisiert werden, um auf Objekt "A" zu zeigen, damit ich dann "B" löschen kann, ohne etwas Wichtiges zu verlieren.
Danke für Ihre Hilfe!
python
django
django-models
merge
erikcw
quelle
quelle
set
das zugehörige Objekt auf das A gezeigt?Antworten:
Django <= 1,7
Dadurch erhalten Sie die Eigenschaftsnamen für alle verwandten Objekte:
Sie können dann so etwas verwenden, um alle zugehörigen Objekte abzurufen:
Ich habe eine Weile versucht, dies herauszufinden, damit ich eine Art "Beobachtermuster" auf einem meiner Modelle implementieren kann. Hoffe es ist hilfreich.
Django 1.8+
Verwenden Sie
_meta.get_fields()
: https://docs.djangoproject.com/de/1.10/ref/models/meta/#django.db.models.options.Options.get_fields (siehe auch in der_get_fields()
Quelle umgekehrt )quelle
all()
Teil wird auf einem fehlschlagenOneToOneField
. Man muss es irgendwie erkennen._meta.get_fields()
: docs.djangoproject.com/de/1.10/ref/models/meta/… (siehe auchreverse
in der_get_fields()
Quelle)_meta.get_fields()
Tipp folgend , war dies Teil der Lösung für mich:links = [field.get_accessor_name() for field in obj._meta.get_fields() if issubclass(type(field), ForeignObjectRel)]
(gegebenfrom django.db.models.fields.related import ForeignObjectRel
)@digitalPBK war in der Nähe ... hier ist wahrscheinlich das, wonach Sie suchen, um Djangos integriertes Material zu verwenden, das in Django admin zum Anzeigen verwandter Objekte während des Löschens verwendet wird
Auf diese Weise können Sie erstellen, was der Django-Administrator anzeigt - die zu löschenden zugehörigen Objekte.
quelle
Collector
(in Zeile 1 importiert) nicht verwendet?Probieren Sie es aus.
quelle
Das Folgende wird von Django verwendet, um alle verwandten Objekte abzurufen
quelle
links = [rel.get_accessor_name() for rel in a._meta.get_all_related_objects()]
Sie können dann so etwas verwenden, um alle zugehörigen Objekte abzurufen:
Aus Django 1.10 offiziellen Dokumenten:
Wenn wir also das genehmigte Beispiel nehmen, würden wir verwenden:
quelle
python for link in links: objects = getattr(a, link.name).all() for object in objects:
Funktioniert für verwandte Sets, jedoch nicht für ForeignKeys. Da RelatedManager dynamisch erstellt werden, ist das Anzeigen des Klassennamens einfacher als das Ausführen einer isinstance ()
quelle
Django 1.9
get_all_related_objects () ist veraltet
Hinweis: RemovedInDjango110Warning: 'get_all_related_objects ist eine inoffizielle API, die veraltet ist. Möglicherweise können Sie es durch 'get_fields ()' ersetzen.
quelle
Hier ist eine andere Möglichkeit, eine Liste von Feldern (nur Namen) in verwandten Modellen abzurufen.
quelle
Leider gibt user._meta.get_fields () nur Beziehungen zurück, auf die der Benutzer zugreifen kann. Möglicherweise haben Sie jedoch ein verwandtes Objekt, das related_name = '+' verwendet. In diesem Fall würde die Beziehung von user._meta.get_fields () nicht zurückgegeben. Wenn Sie eine generische und robuste Methode zum Zusammenführen von Objekten benötigen, würde ich empfehlen, den oben genannten Collector zu verwenden.
quelle