2012-01-02 12 views
41

Così, ho un file di models.py nella cartella applicazione:Django ottenere l'elenco dei modelli in applicazione

from django.db import models 
class Model_One(models.Model): 
    ... 
class Model_Two(models.Model): 
    ... 
... 

Può essere di circa 10-15 classi. Come trovare tutti i modelli in MyApp e ottenere i loro nomi?

Poiché i modelli non sono iterabili, non so se questo sia possibile.

+2

@downvoter, vuoi condividere perché hai downvoted? Non c'è niente di sbagliato in questa domanda (+1 per fare equilibrio) – juliomalegria

+0

Non sono d'accordo con il downvote. Grep non è adatto se vuoi conoscere i modelli in fase di esecuzione. In questo caso, get_app e get_models sono perfetti. – Alasdair

+0

"conosci i modelli in fase di runtime"? Cosa significa questo? –

risposta

81

UPDATE

versioni più recenti delle Django controllare Sjoerd risposta qui sotto

risposta originale a partire dal 2012: Questo è il modo migliore per realizzare ciò che si vuole fare:

from django.db.models import get_app, get_models 

app = get_app('my_application_name') 
for model in get_models(app): 
    # do something with the model 

In questo esempio, model è il modello attuale, quindi si può fare un sacco di cose con esso:

for model in get_models(app): 
    new_object = model() # Create an instance of that model 
    model.objects.filter(...) # Query the objects of that model 
    model._meta.db_table # Get the name of the model in the database 
    model._meta.verbose_name # Get a verbose name of the model 
    # ... 
+1

Grazie mille, ha funzionato) – Feanor

+1

@ user1126473 lieto di aver aiutato :) – juliomalegria

+10

Dal django 1.7, dovresti usare il nuovo sistema di caricamento delle applicazioni: 'da django.apps import apps' che contengono questi metodi. 'django.db.models.loading' sarà rimosso in django 1.9. – Ben

41

Da Django 1.7 in poi, è possibile utilizzare questo codice, ad esempio nel vostro admin.py di registrare tutti i modelli:

from django.apps import apps 
from django.contrib import admin 
from django.contrib.admin.sites import AlreadyRegistered 

app_models = apps.get_app_config('my_app').get_models() 
for model in app_models: 
    try: 
     admin.site.register(model) 
    except AlreadyRegistered: 
     pass 
1

Un'alternativa è quella di utilizzare Content Types.

Ogni modello per ogni applicazione in INSTALLED_APPS ottiene una voce nei modelli ContentType. Ciò consente, ad esempio, di avere una chiave esterna per un modello.

>>> from django.contrib.contenttypes.models import ContentType 
>>> ContentType.objects.filter(app_label="auth") 
<QuerySet [<ContentType: group>, <ContentType: permission>, <ContentType: user>]> 
>>> [ct.model_class() for ct in ContentType.objects.filter(app_label="auth")] 
[<class 'django.contrib.auth.models.Group'>, <class 'django.contrib.auth.models.Permission'>, <class 'django.contrib.auth.models.User'>] 
5

risposta migliore che ho trovato per ottenere tutti i modelli da un app:

from django.apps import apps 
apps.all_models['<app_name>'] #returns dict with all models you defined 
0

Ecco una soluzione rapida-and-dirty, no-codifica utilizzando dumpdata e jq:

python manage.py dumpdata oauth2_provider | jq -r '.[] | .model' | uniq 

È anche possibile pulire il comando jq per ottenere il formato a proprio piacimento.


Bonus: è possibile vedere i conteggi dei diversi tipi di oggetti con l'aggiunta di bandiera -c-uniq.

+0

@Feanor https://meta.stackexchange.com/questions/121908/i-knowledge-question-is-like-two-years-old-but – mgalgs