2012-01-02 14 views
41

में मॉडल की सूची प्राप्त तो, मैं MyApp फ़ोल्डर में एक फ़ाइल models.py है:Django आवेदन

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

इसमें 10-15 के बारे में कक्षाएं हो सकता है। MyApp में सभी मॉडल कैसे ढूंढें और उनके नाम प्राप्त करें?

चूंकि मॉडल पुनरावृत्त नहीं हैं, इसलिए मुझे नहीं पता कि यह भी संभव है या नहीं।

+2

@downvoter, आप साझा क्यों करना चाहते हैं साझा करना चाहते हैं? इस प्रश्न के साथ कुछ भी गलत नहीं है (शेष राशि बनाने के लिए +1) – juliomalegria

+0

मैं डाउनवोट से असहमत हूं। यदि आप रनटाइम पर मॉडल जानना चाहते हैं तो Grep उपयुक्त नहीं है। Get_app और get_models उस मामले में बिल्कुल सही हैं। – Alasdair

+0

"रनटाइम पर मॉडल जानते हैं"? इसका क्या मतलब है? –

उत्तर

81

अद्यतन

Django के नए संस्करणों के लिए जाँच जोएर्ड 2012 से

मूल जवाब नीचे जवाब: यह सबसे अच्छा तरीका है पूरा करने के लिए आप क्या करना चाहते हैं:

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 

इस उदाहरण में, model वास्तविक मॉडल है, इसलिए आप इसके साथ बातें की बहुत कर सकते हैं:

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

में आपकी सलाह का उपयोग करूंगा, धन्यवाद, यह काम करता है) – Feanor

+1

@ user1126473 खुश मैंने मदद की :) – juliomalegria

+10

django 1.7 के बाद से, आपको नए एप्लिकेशन लोडिंग सिस्टम का उपयोग करना चाहिए: 'django.apps आयात ऐप्स' से इन विधियों को शामिल करना चाहिए। django.db.models.loading' django 1.9 में हटा दिया जाएगा। – Ben

41
Django 1.7 से, आप सभी मॉडलों रजिस्टर करने के लिए अपने admin.py में उदाहरण के लिए इस कोड का उपयोग कर सकते हैं,

:

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

एक वैकल्पिक करने के लिए है Content Types का उपयोग करें।

INSTALLED_APPS में प्रत्येक एप्लिकेशन के लिए प्रत्येक मॉडल ContentType मॉडल में एक प्रविष्टि प्राप्त करता है। यह आपको मॉडल के लिए विदेशी कुंजी रखने के लिए, उदाहरण के लिए अनुमति देता है।

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

सर्वश्रेष्ठ उत्तर मैं एक app से सभी मॉडलों पाने के लिए मिला:

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

यहां एक त्वरित और गंदा, कोई कोडिंग का उपयोग कर समाधान है dumpdata और jq:

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

आप अपनी पसंद के प्रारूप को प्रारूप प्राप्त करने के लिए jq कमांड को भी साफ़ कर सकते हैं।


बोनस: आप वस्तुओं के विभिन्न प्रकार के मायने रखता है देख सकते हैं uniq करने के लिए -c झंडा जोड़कर।

+0

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

संबंधित मुद्दे