image.png
image.png
如图, 每一个课程类型对应一张表, 每一门课程都有不同的价格周期对应的价格, 所以价格表会有一个表名字段对应到ContentType表的pk, 但是这样每给一门课程加上价格策略都要有如下步骤
-
拿到课程id
-
拿到表名, 通过表名拿到ContentType表对应的id
-
往价格表里面添加数据
通过课程拿到价格
-
拿到表名
-
通过ContentType表拿到对应的表名id
-
在价格表通过表名id与课程id拿到价格
很麻烦!!!!
Django给我们提供了ContentType组件, 自带ContentType这个表
用法:
模型层:
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
# Create your models here.
# 学位课
class Course1(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
# 通过课程拿到价格时用的, 参数一:价格表,参数与参数三都为价格表的字段
policy = GenericRelation('PricePolicy', object_id_field='object_id', content_type_field='contentType')
# 专题课
class Course2(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
policy = GenericRelation('PricePolicy', object_id_field='object_id', content_type_field='contentType')
# 轻客
class Course3(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
policy = GenericRelation('PricePolicy', object_id_field='object_id', content_type_field='contentType')
# 价格表
class PricePolicy(models.Model):
# 跟ContentType表做外键关联
contentType = models.ForeignKey(to=ContentType)
# 正整数,课程id
object_id = models.PositiveIntegerField()
content_obj = GenericForeignKey('contentType', 'object_id')
period = models.CharField(max_length=32)
price = models.FloatField()
视图层:
1. 存价格
def test(request):
course = models.Course1.objects.filter(pk=1).first()
# 只需传入课程对象,周期,价格,就会自动存入表id与课程id
models.PricePolicy.objects.create(
period='60', price=800, content_obj=course
)
return HttpResponse('ok')
2. 询所有价格策略,并且显示对应的课程名称
def test(request):
ret=models.PricePolicy.objects.all()
for i in ret:
print(i.price)
print(i.period)
# content_obj 就是代指关联的课程,或者学位课程的那个对象
print(type(i.content_obj))
print(i.content_obj.name)
return HttpResponse('ok')
3. 通过课程id,获取课程信息和价格策略
def test(request):
course=models.Course1 .objects.filter(pk=1).first()
print(course.policy.all())
return HttpResponse('ok')











网友评论