什么是ContentType
- Django 包含一个 contenttypes应用程序, 该应用程序可以跟踪Django驱动的项目中安装的所有模型, 并提供了用于处理模型的高级通用接口
- 当创建一个django项目时,可以看到在默认的INSTALL_APPS已经包含了django.contrib.contenttypes。
ContentType组件应用
- 在model中定义ForeignKey字段,并关联到ContentType表,通常这个字段命名为content-type
- 在model中定义PositiveIntergerField字段, 用来存储关联表中的主键,通常我们用object_id
- 在model中定义GenericForeignKey字段,传入上面两个字段的名字
from django.contrib.contenttypes.models import ContentType
查看 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.app_labeled_name
- 可以看到ContentType就是一个简单的model.
- django_content_type记录了当前的Django项目中所有model所属的app(即app_label属性)以及model的名字(即model属性)。
- 因此可以通过contenttypes动态的访问model类型
ContentType实例提供的接口
- ContentType.model_class()
- ContentType.objects.get_for_model()
- 通过model或者model的实例来寻找ContentType类型
- ContentType.objects.get_for_id()