Django 中关于ContentType的使用详解

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

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两个字段进行文章获取。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值