溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Django模型的_meta編程

發(fā)布時(shí)間:2020-07-25 03:54:37 來源:網(wǎng)絡(luò) 閱讀:2722 作者:孤雁不獨(dú)飛 欄目:開發(fā)技術(shù)

   Python有反射機(jī)制,Django也不例外,也有很好的反射機(jī)制,每個(gè)Django模型都有一個(gè)屬性_meta,_meta也有屬性和方法,這些屬性和方法反射出了模型的一些特性,如果_meta用的好的話,不僅可也是代碼更加優(yōu)美,而且還可以大大提高代碼的通用性和重復(fù)利用性。下面主要介紹_meta的屬性和方法。

在django項(xiàng)目中,定義一個(gè)模型,然后用dir()函數(shù)打印出該模型的_meta的屬性和方法,結(jié)果如下:

_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:字段類型的緩存,是個(gè)元組,里面的元素反映該模型各個(gè)字段的類型,返回結(jié)果形式如下:

((<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差不多,返回的結(jié)果形式如下:

[<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:布爾型,表示是否是抽象類,抽象類是不能實(shí)例化的。由于python 沒有抽象類、接口的概念,所以要實(shí)現(xiàn)這種功能得abc這個(gè)模塊

abstract_managers:返回抽象管理器列表,管理器是Django 的模型進(jìn)行數(shù)據(jù)庫查詢操作的接口。Django 應(yīng)用的每個(gè)模型都擁有至少一個(gè)管理器

add_field():按順序來插入字段,函數(shù)原型add_field(field, private=False, virtual=NOT_PROVIDED),file參數(shù)是字段類型實(shí)例??蓞⒓舆@部分的源碼,鏈接如下https://github.com/django/django/blob/master/django/db/models/base.py

add_virtual_field():添加一個(gè)虛擬的字段,函數(shù)原型add_virtual_field(field, varargs=None, keywords=None, defaults=None),可用_meta的virtual_fields屬性可以查看該模型下所有的虛擬字段,

app_label:屬性,該模型所在app包的名稱

auto_created:布爾值,表示是否自動(dòng)創(chuàng)建

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

concrete_managers:返回具體的管理器列表,默認(rèn)情況下,Django 為每個(gè)模型類添加一個(gè)名為objects的管理器,所以默認(rèn)情況下,該值至少含義一個(gè)objects管理器。如果你自定義了管理器,那么這個(gè)自定義管理器可以通過這個(gè)屬性獲得。

concrete_model:屬性,返回該模型本身,通過該屬性值,可以用'.'操作訪問它的某個(gè)字段的屬性,包括字段名,是否可以為空等等

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

db_table:屬性,該模型所用的數(shù)據(jù)表的名稱,關(guān)于數(shù)據(jù)表的名稱,可參見django文檔,http://python.usyiyi.cn/django/ref/models/options.html

db_tablespace:當(dāng)前模型所使用的數(shù)據(jù)庫表空間 的名字。默認(rèn)值是項(xiàng)目設(shè)置中的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'])}

它們都關(guān)聯(lián)類一個(gè)User。

fields:屬性,返回一個(gè)列表,列出了該模型的所有字段,如下[<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>,]

我們知道字段其實(shí)是個(gè)Field對(duì)象,它的屬性可以反映這個(gè)字段的特性,也就是模型字段選項(xiàng),比如verbose_name, name, primary_key,max_length, unique, blank等等(Field類的源碼參見https://github.com/django/django/blob/master/django/db/models/fields/__init__.py,模型字段選項(xiàng)含義參見http://python.usyiyi.cn/django/ref/models/fields.html)

get_add_permission():獲取“添加”權(quán)限,返回一個(gè)字符串,類似的還有get_change_permission(),get_delete_permission()

get_all_field_names():返回一個(gè)列表,列表元素是該模型的所有字段名,怎么理解這個(gè)所有呢?這個(gè)所有不僅包括該模型自己定義的字段,還包括與其它模型中與它有關(guān)聯(lián)的字段(即ForeignKey,ManyToManyField,OneToOneField)

get_all_related_m2m_objects_with_model():獲取與該模型存在ManyToManyField關(guān)系的所有模型,返回一個(gè)列表,例如[(<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(),獲取與該模型存在關(guān)聯(lián)關(guān)系的所有模型

get_field():原型get_field(name,many_to_many=True),field_name是字符串,返回模型該字段名對(duì)應(yīng)的字段Field對(duì)象,如<django.db.models.fields.related.ForeignKey: create_user>,如果該字段名不存在,返回一個(gè)FieldDoesNotExist 異常

get_field_by_name():同上,返回值比上面要豐富些(<django.db.models.fields.related.ForeignKey: create_user>, None, True, False),分別表示 (field_object, model, direct, m2m),如果模型該字段存在direct是 True,如果模型存在ManyToManyField關(guān)系,則m2m為True

get_fields_with_model():返回該模型所有字段的(字段,模型)對(duì)序列,該模型對(duì)于當(dāng)前模型上的字段,元素為無

get_latest_by:屬性,返回模型中某個(gè)可排序的字段的名稱,如果你在模型的元選項(xiàng)中定義了get_latest_by的值,則_meta.get_latest_by會(huì)返回元選項(xiàng)中定義的get_latest_by的值,否則返回None,關(guān)于元選項(xiàng),參見django文檔http://python.usyiyi.cn/django/ref/models/options.html

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

get_ordered_objects():返回根據(jù)此對(duì)象排序的選項(xiàng)對(duì)象的列表

has_auto_field:屬性,返回布爾值,表示該模型有沒有自增字段

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

installed:屬性,布爾值,該模型所在的app是否在django的setting文件里配置,即setting文件的INSTALLED_APPS里是否有該模型所在的app的名稱

local_fields:屬性,返回該模型的所有本地字段,返回值是個(gè)列表,元素是字段類型

local_many_to_many:屬性,返回該模型的所有是many_to_many關(guān)系的字段,不包括其父類,返回值是個(gè)列表;類似的還有一個(gè)many_to_many返回模型及其父類中所有是many_to_many關(guān)系字段的列表。

managed:屬性,布爾值

module_name:屬性,返回模型名,是小寫的,類型是字符串

object_name:屬性,模型名,字符串,但是不是小寫的,定義模型時(shí)用的是什么名字這兒顯示的就是什么名字,是原型

ordering:屬性,返回一個(gè)列表,對(duì)象默認(rèn)的順序。如果你在模型的元選項(xiàng)中定義了ordering的值,則_meta.ordering會(huì)返回元選項(xiàng)中定義的ordering的值,否則返回[]

permissions:屬性,返回一個(gè)列表,返回創(chuàng)建對(duì)象時(shí)權(quán)限表中額外的權(quán)限.如果你在模型的元選項(xiàng)中定義了permissions的值,則_meta.permissions會(huì)返回元選項(xiàng)中定義的permissions的值,否則返回[],類似這種機(jī)制的還有unique_together, verbose_name, verbose_name_plural, verbose_name_raw

pk:屬性,返回主鍵字段類型

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

希望對(duì)你在使用Django時(shí)能有所幫助,不正之處歡迎批評(píng)指正!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI