一 項目背景
路飛學成項目,有課程,學位課(不一樣的課程字段不同),價格策略數據庫
問題,1 如何設計表結構,來表示這種規則
2 爲專題課,添加三個價格策略
3 查詢全部價格策略,而且顯示對應的課程名稱
4 經過課程id,獲取課程信息和價格策略django
二 版本一
一個課程表,包含學位課和專題課,一個價格策略表,一對多關聯json
三 版本二
學位課表,專題課表,裝逼課表,價格策略表(在價格策略課表中加入多個FK跟課程表作關聯):後期再加其它課程,可維護性差app
四 最終版(使用ContentType)
經過Django提供的ContentType表,來構建post
models層建立:this
from django.db import models from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation class Course(models.Model): title = models.CharField(max_length=32) # 不會在數據庫中生成字段,只用於數據庫操做 # policy = GenericRelation('PricePolicy',object_id_field='object_id',content_type_field='contentType') class DegreeCourse(models.Model): title = models.CharField(max_length=32) class PricePolicy(models.Model): # 跟ContentType表作外鍵關聯 contentType = models.ForeignKey(to=ContentType) # 正數 object_id = models.PositiveIntegerField() # 引入一個字段,不會在數據庫中建立,只用來作數據庫操做 # content_obj = GenericForeignKey('contentType', 'object_id') period = models.CharField(max_length=32) price = models.FloatField()
views層:spa
from app01 import models def test(request): import json # 方式一插入價格規則 # ret=models.ContentType.objects.filter(model='course').first() # course=models.Course.objects.filter(pk=1).first() # print(ret.id) # models.PricePolicy.objects.create(period='30',price=100,object_id=course.id,contentType_id=ret.id) # 方式二插入價格規則 # course=models.Course.objects.filter(pk=1).first() # # content_obj=course 會自動的把課程id放到object_id上,而且去ContentType表中查詢課程表的id,放到contentType上 # models.PricePolicy.objects.create(period='60',price=800,content_obj=course) # 增長學位課,價格規則 # degreecourse = models.DegreeCourse.objects.filter(pk=1).first() # models.PricePolicy.objects.create(period='60', price=800, content_obj=degreecourse) # 查詢全部價格策略,而且顯示對應的課程名稱 # ret=models.PricePolicy.objects.all() # for i in ret: # print(i.price) # print(i.period) # # content_obj 就是代指關聯的課程,或者學位課程的那個對象 # print(type(i.content_obj)) # print(i.content_obj.title) # 經過課程id,獲取課程信息和價格策略 course=models.Course.objects.filter(pk=1).first() print(course.policy.all()) return render(request,'test.html')