Django中的contenttypes框架
使用django-admin startproject {项目名}后,
# settings.py
DJANGO_APPS = [
...
"django.contrib.contenttypes",
...
]
并且在生成数据库时,会默认生成一张django_content_type表,如下所示
这张表记录了所有 模型类名字 与 所属的应用
id | app_label | model |
---|---|---|
1 | 应用名 | 模型类 类名 |
2 | … | … |
3 | … | … |
来看一下此模型类的 源码(重要部分):
from django.contrib.contenttypes.models import ContentType
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
@property # 将函数装华为属性
def name(self):
'''获取 指定self.app_label, self.model 模型类的 类名'''
model = self.model_class()
if not model:
return self.model
# 获取到 model 则将 model元数据的 verbose_name 返回
return str(model._meta.verbose_name)
def model_class(self):
"""Return the model class for this type of content."""
try:
# django.apps 模块的public的方法,返回与app_label, model对应的模型类
return apps.get_model(self.app_label, self.model)
except LookupError:
return None
PS: 在Python代码中,可以使用django.apps.apps引用上述settings.py中的INSTALLED_APPS变量。django.apps.apps也被称为应用注册器
综上所述可以概括为:
ContentType 是由Djnago框架提供的一个核心功能,对当前项目中所有基于Django驱动的model(继承自models.Model并且写在modles.py中)提供了更高层次的model接口
那么生成这张表有什么作用呢?
-
Django权限管理中的Permission借助ContentType 实现了对任意models的权限操作
-
ContentType的通用类型 - GenericRelation
ContentType的通用类型 - GenericRelation
什么是GenericRelation和GenericForeignKey
假设现在有一个 博客项目 开发模型类时,有文章、图片等等 都需要可评论(comment)
简单代码如下:
from django.db import models
from django.