Django получить список моделей в приложении
Итак, у меня есть файл models.py в папке MyApp:
from django.db import models
class Model_One(models.Model):
...
class Model_Two(models.Model):
...
...
Это может быть около 10-15 классов.
Как найти все модели в MyApp и получить их названия?
Поскольку модели не повторяемы, я не знаю, возможно ли это вообще.
Ответы
Ответ 1
UPDATE
для более новых версий Django проверьте 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
# ...
Ответ 2
Из Django 1.7 on вы можете использовать этот код, например, в своем 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
Ответ 3
Лучший ответ, который я нашел, чтобы получить все модели из приложения:
from django.apps import apps
apps.all_models['<app_name>'] #returns dict with all models you defined
Ответ 4
Альтернативой является использование Типы контента.
Каждая модель для каждого приложения в 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
Здесь быстрое и грязное, без кодирования решение с использованием dumpdata
и jq
:
python manage.py dumpdata oauth2_provider | jq -r '.[] | .model' | uniq
Вы также можете очистить команду jq
, чтобы получить формат по своему усмотрению.
Бонус: вы можете видеть подсчеты различных типов объектов, добавляя флаг -c
к uniq
.
Ответ 6
Это распечатывает команды для сброса приборов для всех объектов в вашем проекте. Вам необходимо скопировать список приложений из файла настроек. (Я переместил свои приложения в каталог 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, нигде не тестировал.