什么是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框架