本篇文章为大家展示了怎么在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_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
我们先来考虑一个问题,如何把这些商品和优惠卷相关联?