怎么在Django中使用contenttypes框架

  介绍

本篇文章为大家展示了怎么在Django中使用contenttypes框架,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

<强>一、什么是Django contenttypes ?

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

<强>二,Django contenttypes做了什么?

当使用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_content_type的表。

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

怎么在django中使用contenttypes框架

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

当然,django_content_type并不只是记录属性这么简单,contenttypes是对模型的一次封装,

因此可以通过contenttypes动态的访问模型类型,而不需要每次进口具体的模型类型。

<李>

ContentType实例提供的接口,

<李>

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

<李>

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

<李>

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

<李>

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

<李>

ContentType.model_class (),

<李>

ContentType.get_object_for_this_type (),

<李>

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

<李>

ContentType.objects.get_for_id (),

<李>

ContentType.objects.get_for_model (),

<强>三,django contenttypes的使用场景

在我们这个项目中各种商品的优惠卷就运用到了这个知识点:

假使我们模型下有这几张表:

class 电动车(models.Model):, #电器类   时间=name 才能;models.CharField (max_length=32)   价格=,才能models.IntegerField(默认=100)      def 才能__str__(自我):   ,,,return  self.name         class 食物(models.Model):,,, #食物类   时间=name 才能;models.CharField (max_length=32)   时间=price 才能;models.IntegerField(默认=100)      def 才能__str__(自我):   ,,,return  self.name         class 衣服(models.Model):,, #衣服类   时间=name 才能;models.CharField (max_length=32)   价格=,才能models.IntegerField(默认=100)   def 才能__str__(自我):   ,,,return  self.name      class 优惠券(models.Model):,, #优惠券   时间=name 才能;models.CharField (max_length=32)      def 才能__str__(自我):   ,,,return  self.name

我们先来考虑一个问题,如何把这些商品和优惠卷相关联?

怎么在Django中使用contenttypes框架