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()
model.py

 

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')
views.py

 

GenericForeignKey, GenericRelation 
都不会在数据库中生成字段,只是方便查询

 

posted @ 2018-04-12 21:58  沈俊杰  阅读(1739)  评论(0编辑  收藏  举报