Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。
应用场景:某一在线教育网,需要为每位积极客户发一些观看视频的优惠券,但是,对于不同类型的视频,优惠券是不同。
比如:有一个普通课程,需要发一些满200减30的优惠券,而又有精品课程,需要发满100减70的优惠券。
根据以上需求,很快就知道,需要三张表,学位课程表,课程表以及优惠券表,那么,这三张表又是如何关联的呢?
# A 学位课程表结构
# ID 名称
# 1 学位课1
# 2 学位课2
# B 普通课程表
#ID 名称
#1 普通课1
#2 普通课2
# 优惠券表
#ID 优惠券名称 A(FK) B(FK)
#1 通用优惠券 null null # 两个都为空,说明全场都可以使用
#2 满100-10 1 null # 给学位课程创建优惠券
#3 满200-30 null 1 # 给普通课程创建优惠券
再来一种课程,上面的优惠券表还需要额外新增一列,为了解决这个问题,可以使用ContentType类来实现上述需求。
from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
from django.contrib.contenttypes.models import ContentType
class DegreeCourse(models.Model):
"""学位课程
ID 名称
1 学位课1
2 学位课2
"""
name = models.CharField(max_length=128, unique=True)
x1 = GenericRelation("Coupon")
class Course(models.Model):
"""课程
ID 名称
1 普通课1
2 普通课2
"""
name = models.CharField(max_length=128, unique=True)
x1 = GenericRelation("Coupon")
class Coupon(models.Model):
"""优惠券生成规则
ID 优惠券名称 A FK B FK c.FK
1 通用 null null
2 满100-10 8 1
3 满200-30 8 2
4 满200-30 9 1
ID 优惠券名称 content_type_id(表) object_id(表中数据ID)
1 通用 null null
2 满100-10 8 1
3 满200-30 8 2
4 满200-30 9 1
"""
name = models.CharField(max_length=64, verbose_name="活动名称")
brief = models.TextField(blank=True, null=True, verbose_name="优惠券介绍")
# 那个表?
content_type = models.ForeignKey(ContentType, blank=True, null=True, on_delete=models.SET_NULL)
# 对象ID
object_id = models.PositiveIntegerField("绑定课程", blank=True, null=True, help_text="可以把优惠券跟课程绑定")
content_object = GenericForeignKey('content_type', 'object_id')