Domanda

Senza avere il percorso completo del modulo di un modello Django, è possibile fare qualcosa del tipo:

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

... al contrario di:

User.objects.all().

EDIT: sto cercando di effettuare questa chiamata in base all'input della riga di comando. È possibile evitare la dichiarazione di importazione, ad es.

model = django.authx.models.User

Senza che Django restituisca l'errore:

"global name django is not defined."
È stato utile?

Soluzione

Penso che tu stia cercando questo:

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

Esistono altri metodi, ovviamente, ma questo è il modo in cui lo gestirò se non sapessi quale file di modelli devi importare nel tuo spazio dei nomi. (Nota che non c'è davvero modo di ottenere un modello in modo sicuro senza prima sapere a quale app appartiene. Guarda il codice sorgente su loading.py se vuoi testare la fortuna per iterare su tutti i modelli delle app.)

Aggiornamento per Django 1.7+: Secondo Django's sequenza temporale di deprecazione , django.db.models.loading è stato deprecato in Django 1.7 e verrà rimosso in Django 1.9. Come sottolineato nella la risposta di Alasdair , In Django 1.7+ esiste un registro applicazioni . Puoi utilizzare le apps.get_model per ottenere dinamicamente un modello:

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

Altri suggerimenti

Per Django 1.7+, esiste un registro applicazioni . Puoi utilizzare apps.get_model metodo per ottenere dinamicamente un modello.

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

model = django.authx.models.User

     

? Django restituisce un errore " globale   il nome Django non è definito. "

Django non restituisce l'errore. Python lo fa.

Innanzitutto, DEVI importare il modello. Devi importarlo con

from django.authx.models import User

In secondo luogo, se si riceve un errore che django non è definito, Django non è installato correttamente. Devi avere Django sul tuo PYTHONPATH o installato nei pacchetti lib / site di Python.

Per installare Django correttamente, consultare http: // docs. djangoproject.com/en/dev/intro/install/#intro-install

Le classi sono " prima classe " oggetti in Python, nel senso che possono essere passati e manipolati proprio come tutti gli altri oggetti.

I modelli sono classi - puoi capire dal fatto che crei nuovi modelli usando le istruzioni di classe:

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

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

Entrambi gli identificatori Person e AnthropomorphicBear sono legati alle classi Django, quindi puoi passarli in giro. Ciò può essere utile se si desidera creare funzioni di supporto che funzionano a livello di modello (e condividono un'interfaccia comune):

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))

Quindi print_obj_by_last_name funzionerà con i modelli Person o AnthropomorphicBear . Basta passare il modello in questo modo:

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

Se hai il nome del modello passato come stringa, immagino che un modo potrebbe essere

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

Ma confondersi con globals () potrebbe essere un po 'pericoloso in alcuni contesti. Quindi gestisci con cura :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top