3月9日学习内容整理:django的ContentType组件
1、django内置的ContentType组件就是帮我们做连表操作的
应用范围:
比如说某些在线教育平台推出的课程有多种类别,不同类别价格策略也不同,那如何用一张表来表示所有课程的价格策略,就想到用两个字段来确定具体的某个课程,一个字段代表表名对应一种类别的课程,一个字段代表具体的课程对应的id,这两个字段就能够唯一确定某一个课程
这样的话我们还得额外再创建一张表来保存所有类别课程对应的表名,这样的话其实是有点繁琐的,这里ContentType组件就可以帮我们来做这件事
2、如何使用
(1)创建表关系
models.py文件中,首先引入:
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation from django.contrib.contenttypes.models import ContentType
其中定义字段:数据库迁移时django会自动创建django_content_type表,里面就是所有app和对应的表名
# 这个字段就代表表名,只是在ForeignKey中加上ContentType参数 content_type = models.ForeignKey(ContentType, verbose_name='关联的表名称',on_delete=models.CASCADE) # 这个字段就代表具体的课程对应的id object_id = models.IntegerField(verbose_name='关联的表中的数据行的ID') # 这个字段就是帮助我们如何用contenttype来插入记录,数据库中不会存在这个字段 content_object = GenericForeignKey('content_type', 'object_id')
在课程表中,可以设置字段,用来进行反向查询
title = models.CharField(max_length=32) # 仅用于反向查找,数据库中不会存在这个字段 price_policy_list = GenericRelation("PricePolicy")
(2)如何插入记录
首先在model中定义的字段,如上,content_object 就利用这个字段
# 首先要得到某个具体的课程对象 obj3 = models.Course.objects.filter(title='rest framework').first() # 用create方法创建记录时,只需将这个课程对象赋值给我们定义的使用contenttype创建记录的字段就可以了,contenttype就会自动把对应的值赋值给相应的字段 models.PricePolicy.objects.create(price=29.9, period=90, content_object=obj3)
(3)如何进行反向查询
# 首先得到某个具体的课程对象 course = models.Course.objects.filter(id=1).first() # 用课程对象直接.利用contenttype定义的反向查询字段.all就可以得到所有和这个对象关联的记录集合了 price_policys = course.price_policy_list.all()