Django получить список моделей в приложении - PullRequest
53 голосов
/ 02 января 2012

Итак, у меня есть файл models.py в папке MyApp:

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

Это может быть около 10-15 классов. Как найти все модели в MyApp и получить их названия?

Поскольку модели не повторяемы, я не знаю, возможно ли это вообще.

Ответы [ 5 ]

84 голосов
/ 02 января 2012

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
    # ...
61 голосов
/ 02 июля 2015

Начиная с 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
12 голосов
/ 23 сентября 2016

Лучший ответ, который я нашел, чтобы получить все модели из приложения:

from django.apps import apps
apps.all_models['<app_name>']  #returns dict with all models you defined
2 голосов
/ 17 июля 2016

Альтернативой является использование Типы контента .

Каждая модель для каждого приложения в 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'>]
1 голос
/ 18 мая 2017

Вот быстрое и грязное решение без кодирования, использующее dumpdata и jq:

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

Вы также можете очистить команду jq, чтобы получить формат по своему вкусу.


Бонус: вы можете увидеть количество различных типов объектов, добавив флаг -c к uniq.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...