приложения get_models только пользовательские модели - PullRequest
0 голосов
/ 17 мая 2018

В моем проекте отдыха django я создал всего 5 приложений с соответствующими моделями со своими собственными сериализаторами (Аутентификация (-> Профиль), crc (-> Карта, Ответственность, Сотрудник), проект (-> Проект), сценарии (-> Сценарий) и задачи (-> Задача)).Модели также имеют ассоциации друг с другом, такие как

class Project(models.Model):
    stakeholders = models.ManyToManyField(User, blank=True)

class Profile(models.Model):
    user = models.OneToOneField(User, blank=True, on_delete=models.CASCADE, )

class Scenario(models.Model):
    stakeholder = models.ForeignKey(User, related_name='scenarios', blank=True,)
    project = models.ForeignKey(Project, related_name='project_scenarios',)
    tasks = models.ManyToManyField('tasks.Task', blank=True)

class Task(models.Model):
    stakeholder = models.ForeignKey(User, related_name='tasks', blank=True, )
    project = models.ForeignKey(Project, related_name='project_tasks' )  

Я хочу перечислить все модели и соответствующие им методы, которые я написал.Я попытался

import django.apps
print(django.apps.apps.get_models())

, но в нем перечислены все классы, о которых он знает:

[<class 'django.contrib.admin.models.LogEntry'>,
<class 'django.contrib.auth.models.Permission'>,
<class 'django.contrib.auth.models.Group'>,
<class 'django.contrib.auth.models.User'>,
<class 'django.contrib.contenttypes.models.ContentType'>,
<class 'django.contrib.sessions.models.Session'>,
<class 'rest_framework.authtoken.models.Token'>,
<class 'django.contrib.sites.models.Site'>,
<class 'allauth.account.models.EmailAddress'>,
<class 'allauth.account.models.EmailConfirmation'>,
<class 'authentication.models.Profile'>,
<class 'project.models.Project'>,
<class 'tasks.models.Task'>,
<class 'scenarios.models.Scenario'>,
<class 'crc.models.Card'>,
<class 'crc.models.Responsibility'>,
<class 'crc.models.Collaborator'>]

Как я могу получить только эти модели и соответствующие им методы?

ОБНОВЛЕНИЕ:

Я пробовал что-то вроде:

@api_view(['GET'])
def class_list(request):
    my_apps=['authentication', 'crc', 'moel_views', 'project', 'scenarios', 'tasks']

    my_app_models = {name: apps.all_models[name] for name in my_apps}


    return Response(my_app_models)

, но выдает class not JSON serializable ошибка

1 Ответ

0 голосов
/ 17 мая 2018

Вы пытаетесь создать ответ JSON из структуры, содержащей несериализуемые записи (а именно <class 'django.contrib.admin.models.LogEntry'>, <class 'django.contrib.auth.models.Permission'>, и т. Д.).

Как указано в связанном решении: Django: apps.get_models () возвращает модели из юнит-тестов
( Отказ от ответственности: Мой ответ на другой вопрос ), который вы используете, в результате код получит словарь, содержащийкарта приложения к моделям:

{'app_name': OrderedDict_of_models}

Если вы хотите получить имена всех моделей для приложения как JSON из Response, вы можете попробовать .__name__ атрибут каждого элемента в OrderedDict:

@api_view(['GET'])
def class_list(request):
    my_apps=[
        'authentication', 'crc', 'model_views', 'project', 'scenarios', 'tasks'
    ]
    my_app_models = {name: apps.all_models[name] for name in my_apps}

    response = {}
    for key, values in my_app_models.items():
        response[key] = [
            model_name.__name__ for model_name in my_app_models[key].values()
        ]

    return Response(response)

Если вы хотите атрибуты каждой модели, вы можете попробовать __dict__, но будьте осторожны, потому что результатне будет также JSON Serializable, и вам нужно будет их обработать.

...