【问题标题】:How can i extract metdata from django models如何从 django 模型中提取元数据
【发布时间】:2015-04-28 04:16:47
【问题描述】:

假设我在 django 中有这个模型

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

现在我想在 REST 中创建一个序列化程序以从模型中获取所有元数据。

生成的 JSON 应该包含

 //rough example
    {
    first_name: {max_length: 30},
    last_name: {max_length:30}
    }

我的目标是即时获取元数据,然后使用 angularJS 模式表单动态创建表单

关于如何读取模型的元数据的任何想法

【问题讨论】:

标签: python django angularjs django-models metadata


【解决方案1】:

您可以像这样获取模型的字段及其元数据:

def get_model_metadata(model_class, meta_whitelist=[]):
  field_list = model_class._meta.fields
  return_data = {}
  for field in field_list:
    field_name = field.name
    field_meta = field.__dict__
    return_meta = {}
    for meta_name in field_meta:
      if meta_name in meta_whitelist:
        return_meta[meta_name] = field_meta[meta_name]
    if len(return_meta) > 0:
      return_data[field_name] = return_meta
  return return_data

用法:

from django.contrib.auth.models import User
get_model_metadata(User, meta_whitelist=['max_length'])

返回:

{
  'username': {'max_length': 30},
  'first_name': {'max_length': 30},
  'last_name': {'max_length': 30},
  'is_active': {'max_length': None},
  'email': {'max_length': 75},
  'is_superuser': {'max_length': None},
  'is_staff': {'max_length': None},
  'last_login': {'max_length': None},
  'password': {'max_length': 128},
  u'id': {'max_length': None},
  'date_joined': {'max_length': None}
}

对此方法的改进将包括字段元数据的黑名单、字段的白名单/黑名单,以及可能用于不显示具有 None 值的元数据的布尔值。

【讨论】:

    【解决方案2】:

    您应该能够通过自省获得该信息,cf dir(Person._meta) :您可以使用 Person._meta.get_all_field_names() 然后 Person._meta.get_field_by_name('first_name') 获取字段并提取从中获得更多信息。

    【讨论】:

      猜你喜欢
      • 2021-07-08
      • 2020-03-04
      • 2019-12-15
      • 2023-01-02
      • 2019-03-11
      • 2020-09-19
      • 1970-01-01
      • 2012-06-22
      • 2023-04-09
      相关资源
      最近更新 更多