Python有反射机制,Django也不例外,也有很好的反射机制,每个Django模型都有一个属性_meta,_meta也有属性和方法,这些属性和方法反射出了模型的一些特性,如果_meta用的好的话,不仅可也是代码更加优美,而且还可以大大提高代码的通用性和重复利用性。下面主要介绍_meta的属性和方法。

  在django项目中,定义一个模型,然后用dir()函数打印出该模型的_meta的属性和方法,结果如下:

_meta的属性和方法

'__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_field_cache', '_field_name_cache', '_fields', '_fill_fields_cache', '_fill_m2m_cache', '_fill_related_many_to_many_cache', '_fill_related_objects_cache', '_join_cache', '_m2m_cache', '_many_to_many', '_name_map', '_prepare', '_related_many_to_many_cache', '_related_objects_cache', '_related_objects_proxy_cache', 'abstract', 'abstract_managers', 'add_field', 'add_virtual_field', 'admin', 'app_label', 'auto_created', 'auto_field', 'concrete_managers', 'concrete_model', 'contribute_to_class', 'db_table', 'db_tablespace', 'duplicate_targets', 'fields', 'get_add_permission', 'get_all_field_names', 'get_all_related_m2m_objects_with_model', 'get_all_related_many_to_many_objects', 'get_all_related_objects', 'get_all_related_objects_with_model', 'get_ancestor_link', 'get_base_chain', 'get_change_permission', 'get_delete_permission', 'get_field', 'get_field_by_name', 'get_fields_with_model', 'get_latest_by', 'get_m2m_with_model', 'get_ordered_objects', 'get_parent_list', 'has_auto_field', 'init_name_map', 'installed', 'local_fields', 'local_many_to_many', 'managed', 'many_to_many', 'module_name', 'object_name', 'order_with_respect_to', 'ordering', 'parents', 'permissions', 'pk', 'pk_index', 'proxy', 'proxy_for_model', 'related_fkey_lookups', 'setup_pk', 'setup_proxy', 'unique_together', 'verbose_name', 'verbose_name_plural', 'verbose_name_raw', 'virtual_fields'

下面介绍一下它的主要属性和方法。

_field_cache:字段类型的缓存,是个元组,里面的元素反映该模型各个字段的类型,返回结果形式如下:

((<django.db.models.fields.AutoField: id>, None), (<django.db.models.fields.DateTimeField: create_time>, None), (<django.db.models.fields.related.ForeignKey: create_user>, None), (<django.db.models.fields.DateTimeField: write_time>, None), (<django.db.models.fields.related.ForeignKey: write_user>, None), (<django.db.models.fields.related.ForeignKey: confirm_user>, None), (<django.db.models.fields.DateTimeField: confirm_date>, None))

_field_name_cache:跟上面的_field_cache差不多,返回的结果形式如下:

[<django.db.models.fields.AutoField: id>, <django.db.models.fields.DateTimeField: create_time>, <django.db.models.fields.related.ForeignKey: create_user>, <django.db.models.fields.DateTimeField: write_time>, <django.db.models.fields.related.ForeignKey: write_user>, <django.db.models.fields.related.ForeignKey: confirm_user>]

abstract:布尔型,表示是否是抽象类,抽象类是不能实例化的。由于python 没有抽象类、接口的概念,所以要实现这种功能得abc这个模块

abstract_managers:返回抽象管理器列表,管理器是Django 的模型进行数据库查询操作的接口。Django 应用的每个模型都拥有至少一个管理器

add_field():按顺序来插入字段,函数原型add_field(field, private=False, virtual=NOT_PROVIDED),file参数是字段类型实例。可参加这部分的源码,链接如下https://github.com/django/django/blob/master/django/db/models/base.py

add_virtual_field():添加一个虚拟的字段,函数原型add_virtual_field(field, varargs=None, keywords=None, defaults=None),可用_meta的virtual_fields属性可以查看该模型下所有的虚拟字段,

app_label:属性,该模型所在app包的名称

auto_created:布尔值,表示是否自动创建

auto_field:属性,返回所有自增字段类型的字段,一般是`id`字段,如<django.db.models.fields.AutoField: id>

concrete_managers:返回具体的管理器列表,默认情况下,Django 为每个模型类添加一个名为objects的管理器,所以默认情况下,该值至少含义一个objects管理器。如果你自定义了管理器,那么这个自定义管理器可以通过这个属性获得。

concrete_model:属性,返回该模型本身,通过该属性值,可以用'.'操作访问它的某个字段的属性,包括字段名,是否可以为空等等

contribute_to_class():不知道起什么作用,源码https://github.com/django/django/blob/master/django/db/models/options.py

db_table:属性,该模型所用的数据表的名称,关于数据表的名称,可参见django文档,http://python.usyiyi.cn/django/ref/models/options.html

db_tablespace:当前模型所使用的数据库表空间 的名字。默认值是项目设置中的DEFAULT_TABLESPACE,如果它存在的话

duplicate_targets:属性,返回值是字典,表示该模型中,字段属性一样只是名字不一样的字段,例如下例:

from django.db import models
from django.contrib.auth.models import User
class A(models.Model):
create_time = models.DateTimeField(auto_now_add=True)
create_user = models.ForeignKey(User,related_name='%(app_label)s_%(class)s_create_user')
write_time = models.DateTimeField(auto_now=True,blank=True,null=True)
write_user = models.ForeignKey(User,related_name='%(app_label)s_%(class)s_write_user',blank=True)
confirm_user = models.ForeignKey(User,blank=True,null=True,)
confirm_date = models.DateTimeField(blank=True,null=True)
owner = models.ForeignKey(User,related_name='purchases_owner')
review = models.ForeignKey(User,blank=True, null=True,related_name='review')

那么A._meta.duplicate_targets的值就为{'create_user_id': set(['review_id', 'write_user_id', 'owner_id']), 'review_id': set(['create_user_id', 'write_user_id', 'owner_id']), 'write_user_id': set(['create_user_id', 'review_id', 'owner_id']), 'owner_id': set(['create_user_id', 'review_id', 'write_user_id'])}

它们都关联类一个User。

fields:属性,返回一个列表,列出了该模型的所有字段,如下[<django.db.models.fields.AutoField: id>, <django.db.models.fields.DateTimeField: create_time>, <django.db.models.fields.related.ForeignKey: create_user>, <django.db.models.fields.DateTimeField: write_time>, <django.db.models.fields.related.ForeignKey: write_user>, <django.db.models.fields.related.ForeignKey: parent>, <django.db.models.fields.CharField: state>, <django.db.models.fields.related.ForeignKey: owner>, <django.db.models.fields.related.ForeignKey: review>, <django.db.models.fields.CharField: name>, <django.db.models.fields.CharField: tags>,]

我们知道字段其实是个Field对象,它的属性可以反映这个字段的特性,也就是模型字段选项,比如verbose_name, name, primary_key,max_length, unique, blank等等(Field类的源码参见https://github.com/django/django/blob/master/django/db/models/fields/__init__.py,模型字段选项含义参见http://python.usyiyi.cn/django/ref/models/fields.html)

get_add_permission():获取“添加”权限,返回一个字符串,类似的还有get_change_permission(),get_delete_permission()

get_all_field_names():返回一个列表,列表元素是该模型的所有字段名,怎么理解这个所有呢?这个所有不仅包括该模型自己定义的字段,还包括与其它模型中与它有关联的字段(即ForeignKey,ManyToManyField,OneToOneField)

get_all_related_m2m_objects_with_model():获取与该模型存在ManyToManyField关系的所有模型,返回一个列表,例如[(<RelatedObject: human:humansupplier related to user>, None), (<RelatedObject: human:humanrole related to user>, None)]

get_all_related_many_to_many_objects():跟上面的方法差不多,只是返回值的形式略有不同[<RelatedObject: human:humansupplier related to user>, <RelatedObject: human:humanrole related to user>] ,类似的还有get_all_related_objects()get_all_related_objects_with_model(),获取与该模型存在关联关系的所有模型

get_field():原型get_field(name,many_to_many=True),field_name是字符串,返回模型该字段名对应的字段Field对象,如<django.db.models.fields.related.ForeignKey: create_user>,如果该字段名不存在,返回一个FieldDoesNotExist 异常

get_field_by_name():同上,返回值比上面要丰富些(<django.db.models.fields.related.ForeignKey: create_user>, None, True, False),分别表示 (field_object, model, direct, m2m),如果模型该字段存在direct是 True,如果模型存在ManyToManyField关系,则m2m为True

get_fields_with_model():返回该模型所有字段的(字段,模型)对序列,该模型对于当前模型上的字段,元素为无

get_latest_by:属性,返回模型中某个可排序的字段的名称,如果你在模型的元选项中定义了get_latest_by的值,则_meta.get_latest_by会返回元选项中定义的get_latest_by的值,否则返回None,关于元选项,参见django文档http://python.usyiyi.cn/django/ref/models/options.html

get_m2m_with_model():是get_fields_with_model()的many-to-many版本

get_internal_type  获取字段类型

get_ordered_objects():返回根据此对象排序的选项对象的列表

has_auto_field:属性,返回布尔值,表示该模型有没有自增字段

init_name_map():初始化字段名到字段对象(即Field对象)的映射,

installed:属性,布尔值,该模型所在的app是否在django的setting文件里配置,即setting文件的INSTALLED_APPS里是否有该模型所在的app的名称

local_fields:属性,返回该模型的所有本地字段,返回值是个列表,元素是字段类型

local_many_to_many:属性,返回该模型的所有是many_to_many关系的字段,不包括其父类,返回值是个列表;类似的还有一个many_to_many返回模型及其父类中所有是many_to_many关系字段的列表。

managed:属性,布尔值

model_name:属性,返回模型名,是小写的,类型是字符串

object_name:属性,模型名,字符串,但是不是小写的,定义模型时用的是什么名字这儿显示的就是什么名字,是原型

ordering:属性,返回一个列表,对象默认的顺序。如果你在模型的元选项中定义了ordering的值,则_meta.ordering会返回元选项中定义的ordering的值,否则返回[]

permissions:属性,返回一个列表,返回创建对象时权限表中额外的权限.如果你在模型的元选项中定义了permissions的值,则_meta.permissions会返回元选项中定义的permissions的值,否则返回[],类似这种机制的还有unique_together, verbose_name, verbose_name_plural, verbose_name_raw

pk:属性,返回主键字段类型

pk_index():方法,返回fields列表中主键字段的索引。

***以上内容并不完全,根据实际情况进行查找***

Django之模型的_meta属性的更多相关文章

  1. Django框架(七):模型(三) 关联、模型类的属性

    1. 关联 1.1 模型类关系 关系型数据库的关系包括三种类型: ForeignKey:一对多,将字段定义在多的一端中. ManyToManyField:多对多,将字段定义在任意一端中. OneToO ...

  2. Django之模型ORM

    ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...

  3. 64、django之模型层(model)--建表、查询、删除基础

    要说一个项目最重要的部分是什么那铁定数据了,也就是数据库,这篇就开始带大家走进django关于模型层model的使用,model主要就是操纵数据库不使用sql语句的情况下完成数据库的增删改查.本篇仅带 ...

  4. 【Django】模型层说明

    [Django模型层] 之前大概介绍Django的文章居然写了两篇..这篇是重点关注了Django的模型层来进行学习. ■ 模型定义 众所周知,Django中的模型定义就是定义一个类,其基本结构是这样 ...

  5. django的模型类管理器-----------数据库操作的封装

    模型实例方法 str():在将对象转换成字符串时会被调用. save():将模型对象保存到数据表中,ORM框架会转换成对应的insert或update语句. delete():将模型对象从数据表中删除 ...

  6. Django笔记--模型

    ORM是"对象-关系-映射"的简称,在Django当中,ORM就是模型类的管理器对象.操作顺序是先定义模型类,再定义模型类管理器,然后在模型类中实例化一个模型类管理器的对象,作为模 ...

  7. Django ORM模型

    Object Relational Mapping(ORM) 一,ORM介绍 1, ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象 ...

  8. django之模型层(model)--建表、查询、删除基础

    要说一个项目最重要的部分是什么那铁定数据了,也就是数据库,这篇就开始带大家走进django关于模型层model的使用,model主要就是操纵数据库不使用sql语句的情况下完成数据库的增删改查.本篇仅带 ...

  9. python 全栈开发,Day70(模板自定义标签和过滤器,模板继承 (extend),Django的模型层-ORM简介)

    昨日内容回顾 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 Quer ...

随机推荐

  1. 自动完成 APP【字典树(Trie树)+dfs】

    自动完成 APP 传送门  来源:upc12786 题目描述 奶牛 Bessie 很喜欢用手机上网聊天,但她的蹄子太大,经常会按到好几个键造成不必要的麻烦(丢死人了,你下辈子还是不要当奶牛了).于是 ...

  2. (一)HttpClient Get请求

    原文链接:https://blog.csdn.net/justry_deng/article/details/81042379 HttpClient的主要功能: 实现了所有 HTTP 的方法(GET. ...

  3. Arduino + RFID 读取 IC 卡 Arduino uno中获得RFID的UID 并通过串口转发RFID卡号

    RFID简介:射频识别即RFID(Radio Frequency IDentification)技术,又称无线射频识别,是一种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定 ...

  4. Android学习笔记字符串资源

    在新建好的Android项目里res目录下有个字符串资源文件 在xml文件中引用字符串资源 string.xml <resources> <string name="mot ...

  5. 这一次搞懂Spring事务是如何传播的

    文章目录 前言 正文 事务切面的调用过程 事务的传播性概念 实例分析 总结 前言 上一篇分析了事务注解的解析过程,本质上是将事务封装为切面加入到AOP的执行链中,因此会调用到MethodIncepto ...

  6. [置顶] linux中fork()函数详解(原创!!实例讲解)

    分类: 计算机系统 linux2010-06-01 23:35 60721人阅读 评论(105) 收藏 举报 linux2010存储  一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源 ...

  7. 关于自动寻路(Navigation)的初级总结

    1.使用Nav Mesh Link组件 该组件会实现寻路者从Start跳向end点 注意Player会优先选择最佳路线,且Start,End两个物体都应该在Walkable的区域上 2.使用Nav M ...

  8. java中的excel操作

    导入jxl.jar包: 下载个jxl.jar包,然后这个包放在什么位置都行,在你的项目中导入这个包就可以.   具体做法: 项目上右键,点击“属性”, 类别那里选择”库“,点击"添加jar文 ...

  9. Python 程序报错崩溃后,如何倒回到崩溃的位置?

    假设我们有一段程序,从 Redis 中读取数据,解析以后提取出里面的 name 字段: import json import redis client = redis.Redis() def read ...

  10. 手把手教你基于SqlSugar4编写一个可视化代码生成器(生成实体,以SqlServer为例,文末附源码)

    在开发过程中免不了创建实体类,字段少的表可以手动编写,但是字段多还用手动创建的话不免有些浪费时间,假如一张表有100多个字段,手写有些不现实. 这时我们会借助一些工具,如:动软代码生成器.各种ORM框 ...