模型 _meta API

class Options

模型 _meta 的 API 是 Django ORM 的核心。它使系统的其他部分,如查找、查询、表单和管理能够理解每个模型的功能。API 可以通过每个模型类的 _meta 属性来访问,它是 django.db.models.options.Options 对象的一个实例。

它提供的方法可以用来:

  • 检索一个模型的所有字段实例
  • 按名称检索模型的单个字段实例

字段访问 API

按名称检索模型的单个字段实例

Options.get_field(field_name)

返回给定字段名的字段实例。

field_name 可以是模型上的字段名,也可以是抽象或继承的模型上的字段名,或者是指向模型的另一个模型上定义的字段名。在后一种情况下,field_name 将是(按优先级排序)用户设置的 related_query_name,用户设置的 related_name,或者 Django 自动生成的名称。

隐藏字段 不能按名称检索。

如果没有找到指定名称的字段,将引发一个 FieldDoesNotExist 异常。

  1. >>> from django.contrib.auth.models import User
  2. # A field on the model
  3. >>> User._meta.get_field('username')
  4. <django.db.models.fields.CharField: username>
  5. # A field from another model that has a relation with the current model
  6. >>> User._meta.get_field('logentry')
  7. <ManyToOneRel: admin.logentry>
  8. # A non existent field
  9. >>> User._meta.get_field('does_not_exist')
  10. Traceback (most recent call last):
  11. ...
  12. FieldDoesNotExist: User has no field named 'does_not_exist'

检索一个模型的所有字段实例

Options.get_fields(include_parents=True, include_hidden=False)

返回与模型相关联的字段的元组。get_fields() 接受两个参数,可以用来控制返回哪些字段:

  • include_parents

    默认为 True。递归地包括父类上定义的字段。如果设置为 Falseget_fields() 将只搜索直接在当前模型上声明的字段。直接继承自抽象模型或代理类的模型的字段被认为是本地的,而不是在父类上。

    include_hidden

    默认为 False。如果设置为 Trueget_fields() 将包括用于支持其他字段功能的字段。这也将包括任何具有 related_name 的字段(如 ManyToManyFieldForeignKey),并以 “+” 开头。

  1. >>> from django.contrib.auth.models import User
  2. >>> User._meta.get_fields()
  3. (<ManyToOneRel: admin.logentry>,
  4. <django.db.models.fields.AutoField: id>,
  5. <django.db.models.fields.CharField: password>,
  6. <django.db.models.fields.DateTimeField: last_login>,
  7. <django.db.models.fields.BooleanField: is_superuser>,
  8. <django.db.models.fields.CharField: username>,
  9. <django.db.models.fields.CharField: first_name>,
  10. <django.db.models.fields.CharField: last_name>,
  11. <django.db.models.fields.EmailField: email>,
  12. <django.db.models.fields.BooleanField: is_staff>,
  13. <django.db.models.fields.BooleanField: is_active>,
  14. <django.db.models.fields.DateTimeField: date_joined>,
  15. <django.db.models.fields.related.ManyToManyField: groups>,
  16. <django.db.models.fields.related.ManyToManyField: user_permissions>)
  17. # Also include hidden fields.
  18. >>> User._meta.get_fields(include_hidden=True)
  19. (<ManyToOneRel: auth.user_groups>,
  20. <ManyToOneRel: auth.user_user_permissions>,
  21. <ManyToOneRel: admin.logentry>,
  22. <django.db.models.fields.AutoField: id>,
  23. <django.db.models.fields.CharField: password>,
  24. <django.db.models.fields.DateTimeField: last_login>,
  25. <django.db.models.fields.BooleanField: is_superuser>,
  26. <django.db.models.fields.CharField: username>,
  27. <django.db.models.fields.CharField: first_name>,
  28. <django.db.models.fields.CharField: last_name>,
  29. <django.db.models.fields.EmailField: email>,
  30. <django.db.models.fields.BooleanField: is_staff>,
  31. <django.db.models.fields.BooleanField: is_active>,
  32. <django.db.models.fields.DateTimeField: date_joined>,
  33. <django.db.models.fields.related.ManyToManyField: groups>,
  34. <django.db.models.fields.related.ManyToManyField: user_permissions>)