django中Model _meta API

Model _meta API的官方文档  https://docs.djangoproject.com/en/1.10/ref/models/meta/

 

Field access API

>>> from django.contrib.auth.models import User

# A field on the model
>>> User._meta.get_field('username')
<django.db.models.fields.CharField: username>

# A field from another model that has a relation with the current model
>>> User._meta.get_field('logentry')
<ManyToOneRel: admin.logentry>

# A non existent field
>>> User._meta.get_field('does_not_exist')
Traceback (most recent call last):
    ...
FieldDoesNotExist: User has no field named 'does_not_exist'

通过这个field access api的choices可以获取有choice字段的表的内容(元组形式的内容),对于外键字段通过get_choices过去内容的元组的列表

比如在model中有个Customer表

class   Customer(models.Model):
    '''客户表'''
    name = models.CharField(max_length=32,verbose_name='客户姓名',blank=True,null=True)
    qq = models.CharField(max_length=64,verbose_name='QQ',unique=True)
    qq_name = models.CharField(max_length=64,verbose_name='QQ名称',blank=True,null=True)
    phone = models.CharField(max_length=64,blank=True,null=True,verbose_name='手机号码')
    source_choice = (
        (0,'转介绍'),
        (1,'QQ群'),
        (2,'官网'),
        (3,'百度推广'),
        (4,'51CTO'),
        (5,'知乎'),
        (6,'市场推广'),
    )
    source = models.SmallIntegerField(verbose_name='选择来源',choices=source_choice)
    referral_from = models.CharField(verbose_name='介绍人',max_length=64,blank=True,null=True)
    consult_course = models.ForeignKey('Course',verbose_name='咨询课程')
    consultant = models.ForeignKey('UserProfile',verbose_name='顾问')
    content  = models.TextField(verbose_name='咨询详情')
    status_choices = (
          (0, '已报名'),
          (1, '未报名'),
    )
    status = models.SmallIntegerField(choices=status_choices, default=1)
    date = models.DateTimeField(auto_now_add=True)
    memo = models.TextField(verbose_name='备注',blank=True,null=True)
    tags = models.ManyToManyField('Tag')#,blank=True,null=True
    def __unicode__(self):
        return self.qq

通过_meta.get_field('字段名')来获取choice所有的内容

obj = Customer._meta.get_field('source')

print  obj.choices



#输出的结果为
( (0,'转介绍'),(1,'QQ群'), (2,'官网'),(3,'百度推广'),(4,'51CTO'),(5,'知乎'),(6,'市场推广'), )

#那么得到的这个元组就可以用for循环来获取每个小元组项,然后再前端展示

对外键tags的内容获取,通过get_choices()

obj = Customer._meta.get_field('tags')

print  obj.get_choices()



#输出的结果为:

[('', '---------'), (1, 'goser1158'), (2, 'haha')]


#同样也可以对列表进行for循环获取里面的小元组来展现到前端页面

当然还可以外键字段获取外键的名称

obj = Customer._meta.get_field('consultant')

print  type(obj).__name__

#输出的结果为:
'ForeignKey'




obj = Customer._meta.get_field('tags')

print  type(obj).__name__


#输出的结果为:
'ManyToManyField'


#通过判断外键的名称就可以做进一步的处理操作

 利用models中的类表来获取app字符创名称和类表对应数据库中表的字符创名称,这里要用到app_label、model_name

obj = models.Customer._meta

print obj.app_lable

#输出的结果为:'crm'




print  obj.model_name

#输出的结果为:'customer'

 

posted @ 2017-08-06 00:24  goser  阅读(524)  评论(0编辑  收藏  举报