Django 中关于ContentType的使用详解

版权声明:作者:人学物理死的早 出处:https://blog.csdn.net/weixin_39561473 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。 https://blog.csdn.net/weixin_39561473/article/details/89074296

首先举一个例子,我们在做个人博客网站的时候,会对博客的阅读量进行统计,这时候我们只需要创建一张计数表即可,计数表中有博客和阅读量两个字段:

class ReadNum(models.Model):
    read_num = IntegerField(default = 0)
    blog  =models.OneToOneField(Blog,on_delete=models.DO_NOTHING) #一对一外键

但是随着网站越做越大,我们不再满足只是一个博客网站时,我们可能会加入教程或者其他的文章。

这些文章又是新的数据表,同样需要进行计数统计,但是我们的ReadNum使用了一对一的关系绑定了博客表,所以只能制作重复的数据统计表来统计不同类型的文章,例如博客统计表、教程统计表等等。                                      

那有没有一种方法可以让我们只需要一个计数表就能统计所有类型文章的阅读数呢?

当然有,这就需要使用django提供的ContentType方法了。其实这个方法很早就出现在我们的视野中,在settings的APP注册位置,其中就有ContentType app:

使用命令行导入Django中的ContentType,会发现类型为一个模型,使用object.all()查看模型内容,发现是所有我们手动创建的模型和一些内置模型。

官方文档:https://docs.djangoproject.com/en/2.2/ref/contrib/contenttypes/

使用方法:

实例:阅读计数

在models.py中

首先需要导入包:

from django.contrib.contrnttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType

然后创建模型:

read_num是用来计数的字段,剩下三个字段为使用contenttype方法需要添加的字段。并对属性略作修改。

class ReadNum(models.Model):
   read_num = models.IntegerField(default=0)

    #关联的文章,外键
    content_type=models.ForeignKey(ContentType,on_delete=models.DO_NOTHING) 
    #对应模型的主键值,数值类型
    object_id = models.PositiveIntegerField()
    #把content_type和object_id两个字段合并成一个通用的外键
    content_object = GenericForeignKey('content_type', 'object_id') 

在admin后台进行注册:

注册后在admin的后台管理中:

阅读数量内容类型类型id三个字段

那我们不使用admin后台,在views里如何自己编写呢?

还是需要导入contenttype包:

from django.contrib.contenttypes.models import ContentType

然后逻辑如下:

首先获取类型存为变量ct,通过content_type和object_id两个字段进行文章获取。

当然以上内容还可以在进行封装,更加提升通用性。

猜你喜欢

转载自blog.csdn.net/weixin_39561473/article/details/89074296
今日推荐