国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

Django contenttypes 框架詳解(小結(jié))

2020-02-15 22:43:31
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

一、什么是Django ContentTypes?

Django ContentTypes是由Django框架提供的一個(gè)核心功能,它對(duì)當(dāng)前項(xiàng)目中所有基于Django驅(qū)動(dòng)的model提供了更高層次的抽象接口。 當(dāng)然我們不是說(shuō)的是http中的content-type!完全沒(méi)有任何關(guān)系!

下面將一步一步解釋Django ContentTypes在Django框架中做了什么,以及如何使用Django ContentTypes。 

當(dāng)然,如果對(duì)于ContentTypes有了初步了解而只是不了解它的應(yīng)用場(chǎng)景,可以直接查閱一下原文檔:

https://docs.djangoproject.com/en/1.10/ref/contrib/contenttypes/

二、Django ContentTypes做了什么?

當(dāng)使用django-admin初始化一個(gè)django項(xiàng)目的時(shí)候,可以看到在默認(rèn)的INSTALL_APPS已經(jīng)包含了django.contrib.contenttypes:

INSTALLED_APPS = [  'django.contrib.admin',  'django.contrib.auth',  'django.contrib.contenttypes',  'django.contrib.sessions',  'django.contrib.messages',  'django.contrib.staticfiles',]

而且注意django.contrib.contenttypes是在django.contrib.auth之后,這是因?yàn)閍uth中的permission系統(tǒng)是根據(jù)contenttypes來(lái)實(shí)現(xiàn)的。

我們來(lái)查詢(xún)查閱了一下django.contrib.contenttypes.models文件:

class ContentType(models.Model):  app_label = models.CharField(max_length=100)  model = models.CharField(_('python model class name'), max_length=100)  objects = ContentTypeManager()  class Meta:    verbose_name = _('content type')    verbose_name_plural = _('content types')    db_table = 'django_content_type'    unique_together = (('app_label', 'model'),)  def __str__(self):    return self.name

大家可以看到ContentType就是一個(gè)簡(jiǎn)單的django model,而且它在數(shù)據(jù)庫(kù)中的表的名字為django_content_type。

這個(gè)表的名字一般都不會(huì)陌生,在第一次對(duì)Django的model進(jìn)行migrate之后,就可以發(fā)現(xiàn)在數(shù)據(jù)庫(kù)中出現(xiàn)了一張默認(rèn)生成的名為django_content_type的表。

如果沒(méi)有建立任何的model,默認(rèn)django_content_type是這樣的:

因此,django_content_type記錄了當(dāng)前的Django項(xiàng)目中所有model所屬的app(即app_label屬性)以及model的名字(即model屬性)。

當(dāng)然,django_content_type并不只是記錄屬性這么簡(jiǎn)單,contenttypes是對(duì)model的一次封裝,

因此可以通過(guò)contenttypes動(dòng)態(tài)的訪問(wèn)model類(lèi)型,而不需要每次import具體的model類(lèi)型。

ContentType實(shí)例提供的接口  ContentType.model_class()  獲取當(dāng)前ContentType類(lèi)型所代表的模型類(lèi) ContentType.get_object_for_this_type()  使用當(dāng)前ContentType類(lèi)型所代表的模型類(lèi)做一次get查詢(xún) ContentType管理器(manager)提供的接口  ContentType.objects.get_for_id()  通過(guò)id尋找ContentType類(lèi)型,這個(gè)跟傳統(tǒng)的get方法的區(qū)別就是它跟get_for_model共享一個(gè)緩存,因此更為推薦。 ContentType.objects.get_for_model()  通過(guò)model或者model的實(shí)例來(lái)尋找ContentType類(lèi)型
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 苍南县| 崇州市| 华蓥市| 静海县| 普兰县| 定日县| 保山市| 尉氏县| 新和县| 肇源县| 甘洛县| 鹤山市| 杨浦区| 赤峰市| 天台县| 明溪县| 巴彦淖尔市| 射阳县| 自贡市| 漾濞| 渝北区| 保靖县| 佳木斯市| 松阳县| 永寿县| 滁州市| 崇左市| 建平县| 铜鼓县| 宁远县| 普兰店市| 昌邑市| 遵义县| 荥阳市| 松江区| 呈贡县| 阿尔山市| 安仁县| 长沙市| 墨江| 民丰县|