django中的ContentType使用
使用背景
最近设计表的时候遇到一个问题,有两门课程 一门专业课,一门学位课,我们按照时间长度来进行售卖,比如专业课一个月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
都不会在数据库中生成字段,只是方便查询