Frage

Ohne den vollständigen Modulpfad eines Django-Modells ist, ist es möglich, so etwas wie zu tun:

model = 'User' [in Django namespace]
model.objects.all()

... im Gegensatz zu:

User.objects.all().

EDIT: Ich versuche, diesen Aufruf auf Befehlszeileneingabe basieren. Ist es möglich, die Import-Anweisung, zum Beispiel

zu vermeiden
model = django.authx.models.User

Ohne Django den Fehler zurückgegeben:

"global name django is not defined."
War es hilfreich?

Lösung

Ich glaube, Sie suchen diese:

from django.db.models.loading import get_model
model = get_model('app_name', 'model_name')

Es gibt andere Methoden, natürlich, aber das ist die Art, wie ich damit umgehen würde, wenn Sie nicht wissen, welche Modelle Datei, die Sie brauchen in Ihren Namensraum zu importieren. (Man beachte, gibt es wirklich keine Möglichkeit, sicher, ein Modell zu erhalten, ohne vorher zu wissen, was app es gehört. Schauen Sie sich den Quellcode loading.py, wenn Sie Ihr Glück testen möchten bei Iteration über alle Apps' Modelle.)

Update für Django 1.7 +: Nach Djangos deprecation Timeline , django.db.models.loading wurde in Django 1.7 veraltet und wird in Django 1.9 entfernt werden. Wie in Alasdair Antwort wies darauf hin, In Django 1.7+, gibt es eine Anwendungen Registry . Sie können die apps.get_model Methode dynamisch ein Modell bekommen:

from django.apps import apps
MyModel = apps.get_model('app_label', 'MyModel')

Andere Tipps

Für Django 1.7+, gibt es eine Anwendungen Registrierung . Sie können die apps.get_model Methode, um dynamisch ein Modell zu bekommen.

from django.apps import apps
MyModel = apps.get_model('app_label', 'MyModel')
from django.authx.models import User
model = User
model.objects.all()
  

Modell = django.authx.models.User

     

? Django gibt einen Fehler zurück, „global   Name django ist nicht definiert. "

Django kehrt nicht den Fehler. Python hat.

Zunächst müssen Sie das Modell importieren. Sie müssen es importieren mit

from django.authx.models import User

Zweitens, wenn Sie eine Fehlermeldung erhalten, dass django nicht definiert ist, dann wird Django nicht richtig installiert. Sie müssen Django auf Ihrem PYTHONPATH haben oder in Ihrer Python-lib / site-Pakete installiert.

So installieren Django richtig finden Sie unter http: // docs. djangoproject.com/en/dev/intro/install/#intro-install

Die Klassen sind „first class“ Objekte in Python, was bedeutet, können sie wie alle anderen Objekte nur herumgereicht und manipuliert werden.

Die Modelle sind Klassen - Sie aus der Tatsache erklären, dass Sie neue Modelle erstellen mit der Klasse Aussagen:

class Person(models.Model):
    last_name = models.CharField(max_length=64)

class AnthropomorphicBear(models.Model):
    last_name = models.CharField(max_length=64)

Sowohl die Person und AnthropomorphicBear Kennungen zu Django Klassen gebunden, so dass Sie sie um passieren. Dies kann nützlich, wenn Sie wollen Helferfunktionen erstellen, die auf Modellebene arbeiten (und eine gemeinsame Schnittstelle teilen):

def print_obj_by_last_name(model, last_name):
    model_name = model.__name__
    matches = model.objects.filter(last_name=last_name).all()
    print('{0}: {1!r}'.format(model_name, matches))

So print_obj_by_last_name mit arbeiten entweder in der Person oder AnthropomorphicBear Modelle. Übergeben Sie einfach das Modell in etwa so:

print_obj_by_last_name(model=Person, last_name='Dole')
print_obj_by_last_name(model=AnthropomorphicBear, last_name='Fozzy')

Wenn Sie den Modellnamen als String übergeben ich einen Weg erraten konnte sein

modelname = "User"
model = globals()[modelname]

Aber Ausmisten etwa mit Globals () könnte ein bisschen gefährlich in manchen Kontexten sein. So handle with care:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top