1、django组件:contenttype
组件的作用:可以通过两个字段让表和N张表创建FK关系
1、专题课,学位课 如何关联 过期时间??
方法1:分别创建 专题课--过期时间表 、学位课--过期时间表
方法2:专题课,学位课对应到一张过期时间表
方法3:过期时间表与 学位课,专业课,or 其他课程,创建外键关系
2、models初始表结构
$ python manage.py makemigrations
$ python manage.py migrate
3、contenttype表
2、需求1:插入课程与过期时间
1、方法1:ContentType
2、方法2:GenericForeignKey
models表结构
不会生成数据库列
view视图
3、需求2 :根据价格策略查找对应的表和数据
4、需求3:查询过期时间和价格
5、contenttype组件的3件事
1张表跟多张表,动态的创建FK关系
2列实现多张表的FK
其他应用:
优惠券跟多张课程进行关联
公共评论表,与多张表进行关联
6、代码
django组件:contenttype
组件的作用:可以通过两个字段让表和N张表创建FK关系
models
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=128, unique=True) course_img = models.CharField(max_length=255, verbose_name="缩略图") brief = models.TextField(verbose_name="学位课程简介") class Course(models.Model): """专题课程""" name = models.CharField(max_length=128, unique=True) course_img = models.CharField(max_length=255) # 不会在数据库生成列,只用于帮助你进行添加和查询 policy_list = GenericRelation('PricePolicy') class PricePolicy(models.Model): """价格与课程有效期表""" content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) # 关联course or degree_course object_id = models.PositiveIntegerField() # 不会在数据库生成列,只用于帮助你进行添加和查询 content_obj = GenericForeignKey('content_type','object_id') valid_period_choices = ( (1, '1天'), (3, '3天'), (7, '1周'), (14, '2周'), (30, '1个月'), (60, '2个月'), (90, '3个月'), (180, '6个月'), (360, '12个月'), (540, '18个月'), (720, '24个月'), ) valid_period = models.SmallIntegerField(choices=valid_period_choices) price = models.FloatField()
views
from django.shortcuts import render, HttpResponse from django.contrib.contenttypes.models import ContentType from app01 import models def test(request): """价格策略表中增加,查询""" # 1.在价格策略表中添加一条数据 # 方法1 """ models.PricePolicy.objects.create( valid_period=7, price=6.6, content_type=ContentType.objects.get(model='course'), object_id=1 ) """ # 方法2 """ models.PricePolicy.objects.create( valid_period=14, price=9.9, content_obj=models.Course.objects.get(id=1) ) """ # 2.根据某个价格策略对象,找到他对应的表和数据,如:管理课程名称 ''' price = models.PricePolicy.objects.get(id=2) print(price.content_obj.name) # 自动帮你找到 ''' # 3、找到某个课程的所有价格策略 obj = models.Course.objects.get(id=1) print(obj.policy_list.all()) for item in obj.policy_list.all(): print(item.id, item.valid_period, item.price) return HttpResponse('test...')