背景:学位课、专题课、价格策略(每一种课程(学位课和专题课下可分为不同的种类的课程)在不同学习时间内的价格不同)
例如:如何将课程表与价格策略表关联起来:
用外键是可以将课程表和价格策略表关联起来的,但是在后面对表数据的操作起来会非常的复杂,所以我们可以使用Django的ContentType组件来完成:
model.py
class Course(models.Model): name=models.CharField(max_length=32,verbose_name="专题课程") class DegreeCourse(models.Model): name=models.CharField(max_length=32,verbose_name="学位课程") class PricePolicy(models.Model): period=models.CharField(max_length=32,verbose_name="周期") price=models.FloatField(verbose_name="价格")
得到表:
django_content_type表(可以用次表与价格策略表关联)
model.py 加入次字段即可关联PricePolicy表
from django.contrib.contenttypes.models import ContentType
class Course(models.Model): name=models.CharField(max_length=32,verbose_name="专题课程") class DegreeCourse(models.Model): name=models.CharField(max_length=32,verbose_name="学位课程") class PricePolicy(models.Model): content_type=models.ForeignKey(ContentType) object_id=models.PositiveSmallIntegerField() period=models.CharField(max_length=32,verbose_name="周期") price=models.FloatField(verbose_name="价格")
PricePolicy表
![](https://images2018.cnblogs.com/blog/1260936/201804/1260936-20180412202543537-968332221.png)
关于链表查询
model.py
class Course(models.Model): name=models.CharField(max_length=32,verbose_name="专题课程") class DegreeCourse(models.Model): name=models.CharField(max_length=32,verbose_name="学位课程") # 数据库不生成,只用于链表查询 policy_list = GenericRelation("PricePolicy") class PricePolicy(models.Model): content_type=models.ForeignKey(ContentType) object_id=models.PositiveSmallIntegerField(verbose_name="正整数") # 不在数据库中生成,只用于帮助你做数据操作 content_object=GenericForeignKey("content_type","object_id") period=models.CharField(max_length=32,verbose_name="周期") price=models.FloatField(verbose_name="价格")
views.py
from .models import * def index(request): # 为专题课1添加2个价格策略 # course=Course.objects.get(id=1) # PricePolicy.objects.create(period=10,price="19.2",content_object=course) # PricePolicy.objects.create(period=20,price="119.2",content_object=course) # 显示所有的价格策略,并将其对应的课程名称显示。 # price_list=PricePolicy.objects.all() # for obj in price_list: # print(obj.content_object.id,obj.period,("天"),obj.content_object.name) #1 10 天 7天python入门 # 1 10 天 7天python入门 # 1 20 天 7天python入门 # 2 10 天 21天python放弃 # 2 20 天 21天python放弃 # 给你课程ID,获取课程信息+该课程的所有价格策略 course_obj = 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) return HttpResponse("ok")