使用背景
最近設計表的時候遇到一個問題,有兩門課程 一門專業課,一門學位課,我們按照時間長度來進行售賣,比如專業課一個月19元,兩個月35元,三個月50元。
可以這么做但是領導不讓我這么設計。。。。。。
所以就想着用第三章表來實現需求
然后就想着這么設計但是這么設計我在查表的時候實在是太麻煩了,后來發現了ContentType這個神器啊:
這是Django中自帶的ContentType這張表中就有我創建的那三張表(學位課表,專業課表,價格策略表),所以表結構如下
表的創建

from django.db import models # Create your models here. 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): content_type = models.ForeignKey(ContentType) object_id = models.PositiveIntegerField() # 不在數據庫中生成,只用於幫助你做數據操作 content_object = GenericForeignKey('content_type', 'object_id') period = models.CharField(max_length=32) price = models.FloatField()

def index(request): course_obj = Course.objects.get(id=2) # content_obj 是GenericForeignKey 便於操作直接賦予對象即可 PricePolicy.objects.create(period='110', price=9.9, content_object=course_obj) PricePolicy.objects.create(period='120', price=19.9, content_object=course_obj) PricePolicy.objects.create(period='130', price=29.9, content_object=course_obj) price_list = PricePolicy.objects.all() for priceplicy in price_list: # 取出一個個的models對象 . content_obj 就可以去到相對應的 print(priceplicy.content_obj.name,priceplicy.price, priceplicy.period) course_obj = Course.objects.get(id=1) obj = course_obj.policy_list.filter(id=3) objs = course_obj.policy_list.all() print(obj) return HttpResponse('ok')
GenericForeignKey, GenericRelation
都不會在數據庫中生成字段,只是方便查詢