2015-04-28 24 views
2

假设我有在Django我怎样才能提取metdata从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架构形式形成

我如何可以读取元的任何想法模型数据

+0

您可以使用[django-angular](https://github.com/jrief/django-angular)构建您的表格 –

回答

3

你可以得到一个模型的领域和它们的元数据是这样的:

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值的元数据的布尔值。

+0

感谢您的支持,我会试一试 – user3214546

+0

欢迎您! – biomorgoth

1

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