django中的ContentType使用
使用背景
最近设计表的时候遇到一个问题,有两门课程 一门专业课,一门学位课,我们按照时间长度来进行售卖,比如专业课一个月19元,两个月35元,三个月50元。

可以这么做但是领导不让我这么设计。。。。。。
所以就想着用第三章表来实现需求

然后就想着这么设计但是这么设计我在查表的时候实在是太麻烦了,后来发现了ContentType这个神器啊:

这是Django中自带的ContentType这张表中就有我创建的那三张表(学位课表,专业课表,价格策略表),所以表结构如下

表的创建
from django.db import models # Create your models here. 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=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()
model.py
def index(request):
course_obj = Course.objects.get(id=2)
# content_obj 是GenericForeignKey 便于操作直接赋予对象即可
PricePolicy.objects.create(period='', price=9.9, content_object=course_obj)
PricePolicy.objects.create(period='', price=19.9, content_object=course_obj)
PricePolicy.objects.create(period='', price=29.9, content_object=course_obj)
price_list = PricePolicy.objects.all() for priceplicy in price_list:
# 取出一个个的models对象 . content_obj 就可以去到相对应的
print(priceplicy.content_obj.name,priceplicy.price, priceplicy.period) course_obj = Course.objects.get(id=1)
obj = course_obj.policy_list.filter(id=3)
objs = course_obj.policy_list.all() print(obj)
return HttpResponse('ok')
views.py
GenericForeignKey, GenericRelation
都不会在数据库中生成字段,只是方便查询
django中的ContentType使用的更多相关文章
- Django中的许可(Permissions)和用户组(Group)
Reference: http://www.cnblogs.com/esperyong/archive/2012/12/20/2826690.html 接着上面的3篇讨论文章,我们阐述了Django中 ...
- Django中Middleware中间件
Django中Middleware中间件 1 Middleware中间件概述 django中间middleware实质就是一个类,django会根据自己的规则在合适的时机执行中间件相应的方法.实际上当 ...
- Django 组件之 ----- content-type
Django 组件之 content-type的使用 一个表和多个表进行关联,但具体随着业务的加深,表不断的增加,关联的数量不断的增加,怎么通过一开始通过表的设计后,不在后期在修改表,彻底的解决这个问 ...
- django 中下载文件与下载保存为excel
一.django 中下载文件 在实际的项目中很多时候需要用到下载功能,如导excel.pdf或者文件下载,当然你可以使用web服务自己搭建可以用于下载的资源服务器,如nginx,这里我们主要介绍dja ...
- Django中的视图
Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...
- django中使用POST方法 获取POST数据
在django中获取post数据,首先要规定post发送的数据类型是什么. 1.获取POST中表单键值数据 如果要在django的POST方法中获取表单数据,则在客户端使用JavaScript发送PO ...
- django中的ajax组件
目录 django中的ajax 向服务器发送请求的途径 Ajax的特点 基于jquery实现的ajax请求 利用ajax实现计算器 利用ajax实现登陆认证 利用form表单进行文件上传 利用ajax ...
- django中的权限控制(form增删改)
Django默认提供了权限控制,但只能对使用了其自带的登录认证的用户进行权限控制,说白了就是只能对存储在auth_user表中的用户进行权限控制,但不能对未登录过的用户进行权限控制.但如果通过集成LD ...
- Django中HttpRequest和HttpResponse
请求和响应对象 Django中通过使用请求和响应对象来传递系统的状态. 当请求一个页面的时候,Django就创建一个HttpRequest对象,它包含了关于请求的元数据对象,然后Django加载适当的 ...
随机推荐
- js:JavaScript中的ActiveXObject对象
JavaScript中的ActiveXObject对象作用: https://blog.csdn.net/pl1612127/article/details/77862174
- log4go的一些改进设想
log4go 的 4.0.2 版本(https://github.com/ccpaging/log4go/tree/4.0.2)发布以后, 看了看别的 go 语言日志文件设计.发现了一篇好文: log ...
- log4go的日志滚动处理——生产环境的适配
日志处理有三类使用环境,开发环境DE,测试环境TE,生产环境PE. 前两类可以看成是一类,重要的是屏幕显示--termlog.生产环境中主要用的是socklog 和 filelog,即网络传输日志和文 ...
- IOS Block的本质
#import "HMViewController.h" #import "HMPerson.h" @interface HMViewController () ...
- 转 tcp协议里rst字段讲解
TCP协议的原理来谈谈rst复位攻击 http://russelltao.iteye.com/blog/1405349 几种TCP连接中出现RST的情况 https://blog.csdn.net/c ...
- 《编程导论(Java)·9.3.1回调·3》回调的实现
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/yqj2065/article/details/31441221 接<9.3.1Java回调 · ...
- CF526D Om Nom and Necklace
嘟嘟嘟 我们可以把AB看成S,则要找的串可以写成SSSSA或者SSSSS.假设S出现了Q次,那么A出现了Q % k次,则B出现了 Q / k - Q % k次. 当ABABA是SSS的形式时,B可以为 ...
- redis未授权访问getshell
redis未授权访问的问题一年前就爆了,当时刚开始学安全,还不太懂.今天借着工作的机会来搞一把,看看能不能拿下一台服务器.其实前几天就写好了一直想找个实际环境复现一下,一直没有找到,只说下大致思路. ...
- POJ 1191 棋盘分割 【DFS记忆化搜索经典】
题目传送门:http://poj.org/problem?id=1191 棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submission ...
- Linux使用sz、rz命令下载、上传文件
1.安装服务 yum -y install lrzsz 2.上传命令:rz 使用rz命令,会调用系统的资源管理器,选择文件进行上传即可.上传的文件默认保存linux当前所在目录 3.下载命令:sz 根 ...