一:Model _meta
API
模型_meta
API是Django ORM的核心。它使系统的其他部分(如查询,查询,表单和管理员)了解每个模型的功能。
API可以通过_meta
每个模型类的属性来访问,这是一个django.db.models.options.Options
对象的一个实例 。
它提供的方法可以用来:
- 检索模型的所有字段实例
- 按名称检索模型的单个字段实例
二:Model _meta常用方式
1)按名称检索模型的单个字段实例
Options.
get_field
(field_name)[source] ,回给定字段名称的字段实例。
field_name
可以是模型上字段的名称,抽象或继承模型上的字段,或指向模型的另一个模型上定义的字段。
在后一种情况下,field_name
将由related_name
用户定义或由Django本身自动生成的名称。
Hidden fields
不能被名字检索。
如果没有找到具有给定名称的字段, FieldDoesNotExist
则会引发异常
>>> 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'
2)检索模型的所有字段实例
-
Options.
get_fields
(include_parents = True,include_hidden = False)[source] -
返回与模型关联的字段的元组。
get_fields()
接受可以用来控制返回哪些字段的两个参数:include_parents
-
True
默认。递归地包含在父类上定义的字段。如果设置为False
,get_fields()
只会搜索直接在当前模型上声明的字段。直接从抽象模型或代理类继承的模型中的字段被认为是本地的,而不是父类。 include_hidden
-
False
默认。如果设置为True
,get_fields()
将包含用于支持其他字段功能的字段。这也将包括任何有一个related_name
(如ManyToManyField
,或ForeignKey
)以“+”开头的字段。
>>> from django.contrib.auth.models import User
>>> User._meta.get_fields()
(<ManyToOneRel: admin.logentry>,
<django.db.models.fields.AutoField: id>,
<django.db.models.fields.CharField: password>,
<django.db.models.fields.DateTimeField: last_login>,
<django.db.models.fields.BooleanField: is_superuser>,
<django.db.models.fields.CharField: username>,
<django.db.models.fields.CharField: first_name>,
<django.db.models.fields.CharField: last_name>,
<django.db.models.fields.EmailField: email>,
<django.db.models.fields.BooleanField: is_staff>,
<django.db.models.fields.BooleanField: is_active>,
<django.db.models.fields.DateTimeField: date_joined>,
<django.db.models.fields.related.ManyToManyField: groups>,
<django.db.models.fields.related.ManyToManyField: user_permissions>)