背景:学位课、专题课、价格策略(每一种课程(学位课和专题课下可分为不同的种类的课程)在不同学习时间内的价格不同)
例如:如何将课程表与价格策略表关联起来:
用外键是可以将课程表和价格策略表关联起来的,但是在后面对表数据的操作起来会非常的复杂,所以我们可以使用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表
关于链表查询
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")
来源:oschina
链接:https://my.oschina.net/u/4365638/blog/4010705