content-type的表的利用和 路飞学成之 课程和价格的表设计

 为什么会用到content_type  因为价格策略跟课程是一对多的关系,

一个课程 可能有多个价格策略,而且这个时候  有两个课程表学位课普通课程都与价格策略是多对一的关系,而且有可能又有新添加的整个课程的大项目

这个时候在价格策略表上添加外键课程就不合适了(添加一列),所有用到了content_type

创建课程和价格的表格

表关系设计

首先声明本文介绍的ContentType不是http协议中请求头里Content Type,而是Django程序启动后自带的一张表;

1、ContentType表内容介绍

ContentType表记录了Django程序的所有APP下model中的表名、和所在app的名称;

 

2、应用场景:

2.1 通过ContentType中的app名称和表名,查找到Django model中所有表;

 

注意使用GenericForeignKey() 的时候要用的两个字段的名字必须是这两个

 content_type = models.ForeignKey(ContentType)
 object_id = models.PositiveIntegerField()

 

          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):
                    #关联到djangpo 自动生成的表  这个表上有关系
                    content_type = models.ForeignKey(ContentType)
                    object_id = models.PositiveIntegerField()

                    # 不在数据库中生成,只用于帮助你做数据操作,关联自己的建  content_type,和objct_id,但是查找的时候可以按照此字段来查找
                    content_object = GenericForeignKey('content_type', 'object_id')   #此字段不会在数据库表中生成

                    period = models.CharField(max_length=32)
                    price = models.FloatField()

先来看看contenttype表中都有什么内容把

问题2:为专题课1添加3个价格策略

from app01.models import *
#创建一个试图函数,通过对这个函数路径进行访问而执行函数中的内容
def index(request):
    # course_obj内部包含:id=1,表名称=course
    course_obj = models.Course.objects.get(id=1)
    #创建新的PricePolicy数据对象不用传content_type和object_id 因为content_object字段会
    # 自动根据课程对象中的课程id,表名称=course  来自动找出和他在content_type表中的ip
    #和  创建 object_id
    models.PricePolicy.objects.create(period='10', price=9.9, content_object=course_obj)
    models.PricePolicy.objects.create(period='20', price=19.9, content_object=course_obj)
    models.PricePolicy.objects.create(period='30', price=29.9, content_object=course_obj)
    # course_obj内部包含:id=2,表名称=DegreeCourse
    # course_obj = models.DegreeCourse.objects.get(id=2)
    # models.PricePolicy.objects.create(period='110', price=9.9, content_object=course_obj)
    # models.PricePolicy.objects.create(period='120', price=19.9, content_object=course_obj)
    # models.PricePolicy.objects.create(period='130', price=29.9, content_object=course_obj)


    return HttpResponse('DDD')

 问题3:显示所有的价格策略,并将其对应的课程名称显示。

 

#创建一个试图函数,通过对这个函数路径进行访问而执行函数中的内容
def index(request):
    policy_list =Pricepolicy.objects.all()
    for obj in policy_list:
        #虽然content_object不在数据库表中显示,但是可以查看数据的此字段的属性
        print(obj.period,obj.price,'***',obj.content_object,'**',obj.content_object.id,obj.content_object.title)
    return HttpResponse('DDD')

问题4:给你课程ID,获取课程信息+该课程的所有价格策略

 

    course_obj = models.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)

 

posted on 2018-04-12 17:33  王大拿  阅读(168)  评论(0)    收藏  举报

导航