什么是Django contenttypes框架

  介绍

什么是Django contenttypes框架?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

Django contenttypes是由Django框架提供的一个核心功能,它对当前项目中所有基于Django驱动的模型提供了更高层次的抽象接口。

然而,对于Django contenttypes不熟悉的人来说,上面这句话说了跟没说一样,因此,笔者将一步一步解释Django contenttypes在Django框架中做了什么,以及如何使用Django contenttypes。

当然,如果对于contenttypes有了初步了解而只是不了解它的应用场景,可以直接查阅以下这两个链接:

Django官方文档:contenttypes框架

stackoverflow: Django内容类型究竟是怎样起作用的?

当使用django-admin初始化一个Django项目的时候,可以看到在默认的INSTALL_APPS已经包含了django.contrib。contenttypes:

INSTALLED_APPS =, (   ,,,& # 39;django.contrib.admin& # 39;   ,,,& # 39;django.contrib.auth& # 39;   ,,,& # 39;django.contrib.contenttypes& # 39;   ,,,& # 39;django.contrib.sessions& # 39;   ,,,& # 39;django.contrib.messages& # 39;   ,,,& # 39;django.contrib.staticfiles& # 39;   )

而且注意django.contrib.contenttypes是在django.contrib.auth之后,这是因为身份验证中允许的系统是根据contenttypes来实现的。

笔者紧接着查阅了一下django.contrib.contenttypes。模型文件:

class  ContentType (models.Model):   ,,,app_label =, models.CharField (max_length=100)   ,,,model =, models.CharField (_ (& # 39; python  model  class 名字# 39;),,max_length=100)   ,,,objects =, ContentTypeManager ()   ,,,class 元:   ,,,,,,,verbose_name =, _ (& # 39; content 类型# 39;)   ,,,,,,,verbose_name_plural =, _ (& # 39; content 类型# 39;)   ,,,,,,,db_table =, & # 39; django_content_type& # 39;   ,,,,,,,unique_together =, ((& # 39; app_label& # 39;,, & # 39;模型# 39;),)   ,,,def  __str__(自我):   ,,,,,,,return  self.name

大家可以看到ContentType就是一个简单的django模型,而且它在数据库中的表的名字为django_content_type。

有经验的django开发者对于这个表的名字一般都不会陌生,在第一次对django的模型进行迁移之后,就可以发现在数据库中出现了一张默认生成的名为django_content_type的表。

如果没有建立任何的模型中,默认django_content_type是这样的:

sqlite>, select  *,得到django_content_type;   1 |管理| logentry   2 | auth |组   3 | auth |用户   4 | auth |许可   5 | contenttypes | contenttype   | 6 |会议会话

因此,django_content_type记录了当前的Django项目中所有模型所属的应用程序(即app_label属性)以及模型的名字(即模型属性)。

当然,django_content_type并不只是记录属性这么简单,在一开始的时候笔者就提及了contenttypes是对模型的一次封装,因此可以通过contenttypes动态的访问模型类型,而不需要每次进口具体的模型类型。

ContentType实例提供的接口

ContentType.model_class ()

获取当前ContentType类型所代表的模型类

ContentType.get_object_for_this_type ()

使用当前ContentType类型所代表的模型类做一次让查询

ContentType管理器(经理)提供的接口

ContentType.objects.get_for_id ()

通过id寻找ContentType类型,这个跟传统的得到方法的区别就是它跟get_for_model共享一个缓存,因此更为推荐。

ContentType.objects.get_for_model ()

通过模型或者模型的实例来寻找ContentType类型

<强>许可对ContentType的使用

在之前,笔者简单地提及了身份验证中允许有涉及到对ContentType的使用,下面来看一下许可的模型源码:

class 许可(models.Model):   ,,,,,,   ,,,,permissions  system  provides  a  way 用assign  permissions 用具体   ,,,users 以及groups  of 用户。   ,,,,permission  system  is  used  by 从而Django  admin 网站,but  may  also    ,,,useful  your  own 拷贝代码只,Django  admin  site  uses  permissions  as ,如下:   ,,,,,,,什么,,“add", permission  limits 从而用户# 39;s  ability 用view ,“add"形式   ,,,,,,,,,以及add  an 对象。   ,,,,,,,什么,,“change", permission  limits  a 用户# 39;s  ability 用view 从而改变   ,,,,,,,,,,,view ,“change", form 以及change  an 对象。   ,,,,,,,什么,,“delete", permission  limits 从而ability 用delete  an 对象。   ,,,Permissions 断开连接;set  globally  per  type  of 对象,not  per  specific 对象   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

什么是Django contenttypes框架