content-type的表的利用和 路飞学成之 课程和价格的表设计
为什么会用到content_type 因为价格策略跟课程是一对多的关系,
一个课程 可能有多个价格策略,而且这个时候 有两个课程表,学位课和普通课程,都与价格策略是多对一的关系,而且有可能又有新添加的整个课程的大项目
这个时候在价格策略表上添加外键课程就不合适了(添加一列),所有用到了content_type
创建课程和价格的表格
表关系设计
首先声明本文介绍的ContentType不是http协议中请求头里Content Type,而是Django程序启动后自带的一张表;
1、ContentType表内容介绍

ContentType表记录了Django程序的所有APP下model中的表名、和所在app的名称;
2、应用场景:
2.1 通过ContentType中的app名称和表名,查找到Django model中所有表;
注意使用GenericForeignKey() 的时候要用的两个字段的名字必须是这两个
content_type = models.ForeignKey(ContentType) object_id = models.PositiveIntegerField()
from django.db import models #这几个模块一定要引入才能使用。 from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericForeignKey,GenericRelation class DegreeCourse(models.Model): name = models.CharField(max_length=32) class Course(models.Model): name = models.CharField(max_length=32) # 数据库不生成,只用于链表查询, policy_list = GenericRelation("PricePolicy") class PricePolicy(models.Model): #关联到djangpo 自动生成的表 这个表上有关系 content_type = models.ForeignKey(ContentType) object_id = models.PositiveIntegerField() # 不在数据库中生成,只用于帮助你做数据操作,关联自己的建 content_type,和objct_id,但是查找的时候可以按照此字段来查找 content_object = GenericForeignKey('content_type', 'object_id') #此字段不会在数据库表中生成 period = models.CharField(max_length=32) price = models.FloatField()
先来看看contenttype表中都有什么内容把

问题2:为专题课1添加3个价格策略
from app01.models import * #创建一个试图函数,通过对这个函数路径进行访问而执行函数中的内容 def index(request): # course_obj内部包含:id=1,表名称=course course_obj = models.Course.objects.get(id=1) #创建新的PricePolicy数据对象不用传content_type和object_id 因为content_object字段会 # 自动根据课程对象中的课程id,表名称=course 来自动找出和他在content_type表中的ip #和 创建 object_id models.PricePolicy.objects.create(period='10', price=9.9, content_object=course_obj) models.PricePolicy.objects.create(period='20', price=19.9, content_object=course_obj) models.PricePolicy.objects.create(period='30', price=29.9, content_object=course_obj) # course_obj内部包含:id=2,表名称=DegreeCourse # course_obj = models.DegreeCourse.objects.get(id=2) # models.PricePolicy.objects.create(period='110', price=9.9, content_object=course_obj) # models.PricePolicy.objects.create(period='120', price=19.9, content_object=course_obj) # models.PricePolicy.objects.create(period='130', price=29.9, content_object=course_obj) return HttpResponse('DDD')

问题3:显示所有的价格策略,并将其对应的课程名称显示。
#创建一个试图函数,通过对这个函数路径进行访问而执行函数中的内容 def index(request): policy_list =Pricepolicy.objects.all() for obj in policy_list: #虽然content_object不在数据库表中显示,但是可以查看数据的此字段的属性 print(obj.period,obj.price,'***',obj.content_object,'**',obj.content_object.id,obj.content_object.title) return HttpResponse('DDD')

问题4:给你课程ID,获取课程信息+该课程的所有价格策略

course_obj = models.Course.objects.get(id=2) print(course_obj.id) print(course_obj.name)
#此字段不在数据库表中体现,但是可以用此字段进行查询 policy_list = course_obj.policy_list.all() for item in policy_list: print(item.price,item.period)
浙公网安备 33010602011771号