Sprich my_instance
ist vom Modell MyModel
.
Ich suche nach einem guten Weg:
my_model = get_model_for_instance(my_instance)
Ich habe keinen wirklich direkten Weg gefunden, dies zu tun. Bisher habe ich mir Folgendes ausgedacht:
from django.db.models import get_model
my_model = get_model(my_instance._meta.app_label, my_instance.__class__.__name__)
Ist das akzeptabel? Ist es überhaupt ein sicherer, bewährter Weg, dies zu tun?
Es gibt auch _meta.object_name
das, was das gleiche zu liefern scheint wie __class__.__name__
. Macht es? Ist besser oder schlechter? Wenn ja warum?
Woher weiß ich auch, dass ich das richtige Modell erhalte, wenn das App-Label im Rahmen des Projekts mehrmals vorkommt, z. B. 'auth' von 'django.contrib.auth', und dass es auch 'myproject.auth' gibt?
Würde ein solcher Fall get_model
unzuverlässig machen ?
Vielen Dank für Hinweise / Hinweise und Erfahrungsaustausch!
__class__
unbedingt die Klasse für die Instanz sein. Es gibt keine mögliche Mehrdeutigkeit. So funktioniert Python. Was fragst du?__class__.__name__
und wie viele Personen auswählen, welche dieser beiden für die Verwendung inget_model
oder anderswo verwendet werden soll. Vielen Dank!Antworten:
my_model = type(my_instance)
Um dies zu beweisen, können Sie eine andere Instanz erstellen:
my_new_instance = type(my_instance)()
Aus diesem Grund gibt es keine direkte Möglichkeit, da Python-Objekte diese Funktion bereits haben.
Aktualisiert...
Ich mochte Marcinns Antwort , die verwendet
type(x)
. Dies ist identisch mit der ursprünglichen Antwort (x.__class__
), aber ich bevorzuge die Verwendung von Funktionen gegenüber dem Zugriff auf magische Attribute. Auf diese Weise benutze ich liebervars(x)
tox.__dict__
,len(x)
tox.__len__
und so weiter.aktualisiert 2 ...
Für verzögerte Instanzen (von @Cerin in Kommentaren erwähnt) können Sie über auf die ursprüngliche Klasse zugreifen
instance._meta.proxy_for_model
.quelle
only()
.my_new_instance = type(my_instance)()
quelle
Zumindest für Django 1.11 sollte dies funktionieren (auch für verzögerte Instanzen):
def get_model_for_instance(instance): return instance._meta.model
Quelle hier .
quelle
_meta.model
nicht in der_meta
API enthalten und sollte nicht verwendet werden,type()
ist besser und pythonisch.