web-dev-qa-db-ja.com

Djangoアプリケーション内のモデルのリストを取得

だから、私はMyAppフォルダにmodels.pyファイルを持っています:

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

約10〜15クラスです。 MyAppですべてのモデルを見つけて名前を取得する方法

モデルは反復可能ではないため、これが可能かどうかはわかりません。

53
Feanor

[〜#〜] update [〜#〜]

Django check Sjoerd以下の回答の新しいバージョン

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
    # ...
84
juliomalegria

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

アプリからすべてのモデルを取得するために私が見つけた最良の答え:

from Django.apps import apps
apps.all_models['<app_name>']  #returns dict with all models you defined
13
pedrotorres

別の方法は、 コンテンツタイプ を使用することです。

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'>]
3
gkr

dumpdatajqを使用した、簡単で汚れのないコーディングなしのソリューションを次に示します。

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

jqコマンドをクリーンアップして、好みに合わせてフォーマットを取得することもできます。


ボーナス:-cフラグをuniqに追加することにより、さまざまなタイプのオブジェクトの数を確認できます。

1
mgalgs

これにより、プロジェクト内のすべてのオブジェクトのフィクスチャをダンプするコマンドが出力されます。設定ファイルからアプリリストをコピーする必要があります。 (アプリをappsディレクトリ内に移動しました。)

from Django.apps import apps

print(
    '\n'.join(
        [
            '\n'.join(
                [
                    f'PYTHONPATH=.:apps Django-admin dumpdata {app}.{model} --settings=my_project.settings > apps/{app}/fixtures/{model}.json'
                    for model in apps.all_models[app]
                ]
            )
            for app in [
                'my_app',
                'my_other_app',
            ]
        ]
    )
)

正しいDjango-adminを使用しているように、仮想環境をアクティブ化したことを確認してください。 (which Django-admin.pyで確認してください。)

元の質問に正接的にのみ関連していますが、私がやったのと同じ理由でこれに出くわした人には役立つかもしれません。私はDjango 2.2.4で、他でテストしていない。

0
Chris