我如何从 Django 模型中提取元数据
How can i extract metdata from django models
假设我在 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 模式表单动态创建表单
关于如何读取模型的元数据的任何想法
您应该能够通过内省获取该信息,cf dir(Person._meta):您可以使用 Person._meta.get_all_field_names() 然后 Person._meta。 get_field_by_name('first_name') 获取字段并从中提取更多信息。
您可以像这样获取模型的字段及其元数据:
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'])
Returns:
{
'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}
}
对此方法的改进将包括字段元数据黑名单、字段 whitelist/blacklist 以及不显示具有 None 值的元数据的布尔值。
假设我在 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 模式表单动态创建表单
关于如何读取模型的元数据的任何想法
您应该能够通过内省获取该信息,cf dir(Person._meta):您可以使用 Person._meta.get_all_field_names() 然后 Person._meta。 get_field_by_name('first_name') 获取字段并从中提取更多信息。
您可以像这样获取模型的字段及其元数据:
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'])
Returns:
{
'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}
}
对此方法的改进将包括字段元数据黑名单、字段 whitelist/blacklist 以及不显示具有 None 值的元数据的布尔值。