【问题标题】:apps get_models only custom models应用程序 get_models 仅自定义模型
【发布时间】:2018-10-27 15:38:39
【问题描述】:

在我的 django rest 项目中,我创建了总共 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 错误

【问题讨论】:

标签: django django-rest-framework


【解决方案1】:

您正在尝试从包含不可序列化条目的结构(即<class 'django.contrib.admin.models.LogEntry'>, <class 'django.contrib.auth.models.Permission'>, 等)创建JSON 响应。

如链接解决方案中所述:Django: apps.get_models() yields models from unittests
免责声明:我对另一个问题的回答)您正在使用,代码的结果是获取包含应用程序映射到模型的字典:

{'app_name': OrderedDict_of_models}

如果您想从Response 中获取每个应用程序的所有模型名称为JSON,您可以尝试OrderedDict 中每个项目的.__name__ 属性:

@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,您需要对其进行处理。

【讨论】:

  • 感谢您的回答!可悲的是它给了我'OrderedDict' object has no attribute '__name__' 错误
  • 非常感谢!它确实奏效了。是否有任何 api 也可以返回此类模型的所有方法?
  • @Nitish 我会建议这个答案(以及我上面提到的__dict__):stackoverflow.com/questions/1911281/…
猜你喜欢
  • 2022-10-19
  • 1970-01-01
  • 2013-02-24
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 2013-11-24
  • 1970-01-01
相关资源
最近更新 更多