from django.db import models
# Create your models here.
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()
我们在makemigrations
迁移数据库时,django
会自动生成django_content_type
表,该表将我们创建的app
下的models
表进行app_label-models
一一映射
看下我们迁移数据库生成的Course
、DegreeCourse
、PricePolicy
表
app_course
1 基础
app_degreecourse
1 进阶
content_type_id
是我们的django_content_type
表对应的某个app下的某个model
的 id
值
object_id
是价格策略表关联的content_type_id关联的那个model
表中的某条记录id值
content_object
不在数据库中生成,只用于帮助你做数据操作
来看下测试如下:
from django.shortcuts import render,HttpResponse
# Create your views here.
from . import models
def index(request):
# course_obj = models.Course.objects.get(id=1)
# 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)
# degree_course_obj = models.DegreeCourse.objects.get(id=1)
# models.PricePolicy.objects.create(period='8', price=9.9, content_object=degree_course_obj)
# models.PricePolicy.objects.create(period='16', price=19.9, content_object=degree_course_obj)
# models.PricePolicy.objects.create(period='99', price=29.9, content_object=degree_course_obj)
print("显示所有的价格策略,并将其对应的课程名称显示。")
# policy_list = models.PricePolicy.objects.all()
# for obj in policy_list:
# print(obj.period,obj.price,obj.content_object,obj.content_object.id,obj.content_object.name)
print("给你课程ID,获取课程信息+该课程的所有价格策略")
course_obj = models.Course.objects.get(id=1)
policy_list = course_obj.policy_list.all()
for item in policy_list:
print(item.price, item.period)
return HttpResponse("...")
显示所有的价格策略,并将其对应的课程名称显示。
10 9.9 Course object 1 基础
20 19.9 Course object 1 基础
30 29.9 Course object 1 基础
8 9.9 DegreeCourse object 1 进阶
16 19.9 DegreeCourse object 1 进阶
99 29.9 DegreeCourse object 1 进阶
给你课程ID,获取课程信息+该课程的所有价格策略
[12/Apr/2018 16:55:42] "GET /index/ HTTP/1.1" 200 3
9.9 10
19.9 20
29.9 30