当前位置: 首页 > news >正文

Django的contenttypes

这是一个django内置的表结构,为的就是通过两个字段让表和N张表创建FK关系。

比如说有两种不同课程,这两种课程都有价格周期和策略。如果最低级的则是给每个表创建一个价格策略。如果非要在同一个表内使用价格策略,

那么如上图那样,course_id跟专题课程做外键关联,学位课程为空,如果跟学位课程做关联,那么专题课程的ID又为空,如果很多门课程,那么

就需要在价格策略中写入很多的外键字段。

为了解决这种问题,django引入了一种方式就是django的contenttypes。

首先有下面的表结构:

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_object = GenericForeignKey('content_type', 'object_id')


    valid_period_choices = (
        (1, '1天'),
        (3, '3天'),
        (7, '1周'), (14, '2周'),
        (30, '1个月'),
        (60, '2个月'),
        (90, '3个月'),
        (180, '6个月'), (210, '12个月'),
        (540, '18个月'), (720, '24个月'),
    )
    valid_period = models.SmallIntegerField(choices=valid_period_choices)
    price = models.FloatField()

这种结构就相当于下图:

另外建立一个表,存放表名称。

然后在价格策略表中放2个字段,一个字段就是表名,一个就是这个表中第几个数据。

比如course表中第一个数据21天入门。

 

表结构分析:

  content_type = models.ForeignKey(ContentType,on_delete=models.CASCADE)  # 关联course or degree_course
  object_id = models.PositiveIntegerField()  #这个就是课程表内有多少课程,这个约束不了,只能是个正整数。

 

 最后就是查询和增加的测试!

from django.shortcuts import render,HttpResponse
from app01 import models
from django.contrib.contenttypes.models import ContentType

def test(request):
    # 1.在价格策略表中添加一条数据
    # models.PricePolicy.objects.create(
    #     valid_period=7,
    #     price=6.6,
    #     content_type=ContentType.objects.get(model='course'),  #外键关联到这个表
    #     object_id=1    
    # )
   
  #使用神奇的字段创建
# models.PricePolicy.objects.create( # valid_period=14, # price=9.9, # content_object=models.Course.objects.get(id=1) #这样得到就是Course表,而且id是1,这两个。自动帮你添加这两个值。 # )
# 2. 根据某个价格策略对象,找到他对应的表和数据,如:管理课程名称 # price = models.PricePolicy.objects.get(id=2) #ID为2的这条价格策略对象 # print(price.content_object.name) # 关联的是专题课程,想要显示专题课程的名称 21天入门
# 3.找到某个课程关联的所有价格策略 数据库中加这个 policy_list=GenericRelation("PricePolicy") # obj = models.Course.objects.get(id=1) # for item in obj.policy_list.all(): # print(item.id,item.valid_period,item.price) # # return HttpResponse('...')

 

 加的两个字段使用的关系以及使用django.content-type表的使用:

 

 不仅是价格策略,优惠券也会使用这个,比如2种类型的课程,买第一种课程的有优惠券,买第二种课程还可能有优惠券。

 

转载于:https://www.cnblogs.com/geogre123/p/9803315.html

相关文章:

  • 离散傅里叶级数DFS
  • NiftyNet开源平台的使用 -- 配置文件
  • 构造代块 的作用
  • [SCOI2010]传送带
  • 2018.10.17多校
  • [USACO16FEB]负载平衡Load Balancing_Silver(NlogNlogN解法)
  • 在Ubuntu上学习OpenStack之五:控制节点上安装Nova
  • LintCode: coins in a line I
  • 推荐一款功能强大的Tomcat 管理监控工具,可替代Tomcat Manager
  • python web框架 MVC MTV
  • centos7--网易yum源
  • 数据库连接池和软件设计分层模式
  • 英语
  • 蓝牙的Baseband说明
  • 摩斯码编解码器
  • [译] React v16.8: 含有Hooks的版本
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • Android 控件背景颜色处理
  • ES6 ...操作符
  • JavaScript 基础知识 - 入门篇(一)
  • Java比较器对数组,集合排序
  • JS实现简单的MVC模式开发小游戏
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Redash本地开发环境搭建
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • Transformer-XL: Unleashing the Potential of Attention Models
  • Web设计流程优化:网页效果图设计新思路
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 记一次用 NodeJs 实现模拟登录的思路
  • 简单实现一个textarea自适应高度
  • 力扣(LeetCode)22
  • 聊聊hikari连接池的leakDetectionThreshold
  • 模型微调
  • 前嗅ForeSpider教程:创建模板
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 探索 JS 中的模块化
  • 用Python写一份独特的元宵节祝福
  • 终端用户监控:真实用户监控还是模拟监控?
  • kubernetes资源对象--ingress
  • 阿里云服务器如何修改远程端口?
  • 数据库巡检项
  • #if 1...#endif
  • (04)odoo视图操作
  • (python)数据结构---字典
  • (Ruby)Ubuntu12.04安装Rails环境
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (新)网络工程师考点串讲与真题详解
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)mysql使用Navicat 导出和导入数据库
  • ./configure、make、make install 命令