Django:内置组件Content-Type
12.Django组件之Content_Type
1.帮助我们生成了一张表,里面有所有表名.这样不再自建表在表中填表名,用Foreignkey获取
2.为了让我们快速进入插入数据,填写一个字段GenericForeignKey,(不用生成字段)
3.为了让我们快速反向查找,通过添加字段GenericRelation,(仅仅用于反向查找,不生成字段)
- 内置组件,用于帮助我们做连表操作.需求展示:
 - 学习商城分学位课和普通课,学位课有老师提供在线解答,在线解答每个月费用如下表.普通课程不提供在线解答,只提供视频.但观看视频每月需要办理会员.现将2个价格策略表,合成一张表,如下:
 

- 但是如果又有新的服务:比如开了VVIP课程,那么价格策略表又增加一个字段.这样以后添加新服务就要修改表结构.不断更改表结构.这样并不好.
 

- 修改如下方法更加好:
 

这样以后无论增加什么样服务,只需增加字段.这种方式适用于一张表同时关联多张表.
表的创建models.py:
from django.contrib.contenttypes.fields import GenericForeignKey
from django.db import models
from django.contrib.contenttypes.models import ContentType
# Create your models here.
class Course(models.Model):
    """
    普通课程
    """
    title = models.CharField(max_length=32)
class DegreeCourse(models.Model):
    """
    学位课程
    """
    title = models.CharField(max_length=32)
class PricePolicy(models.Model):
    """
    价格策略
    """
    price = models.IntegerField()
    period = models.IntegerField()
    #ContentType会自己创建一张表,将所有表名称添加到该表中
    content_type = models.ForeignKey(ContentType,verbose_name="关联普通课或学位课表")
    object_id = models.IntegerField(verbose_name="关联普通课或学位课中的课程ID")
    #帮助你快速实现content_type操作,会自定将
    #obj = DegreeCourse.objects.filter(title="python全栈").first()
    #GenericForeignKey能够帮助我们:从数据库获取该对象obj的id和此对象对应content_type表里面的id.赋值到该表的
    #content_type和object_id
    content_object = GenericForeignKey("content_type","object_id")
#urls.py
url(r'^test/', views.test),
#views.py
from django.shortcuts import render,HttpResponse
from api import models
# Create your views here.
def test(request):
    """
    """
    #创建1个月的价格
    obj1 = models.DegreeCourse.objects.filter(title="python全栈").first()
    models.PricePolicy.objects.create(price=9.9,period=30,content_object=obj1)
	#创建2个月的价格
    obj2 = models.DegreeCourse.objects.filter(title="python全栈").first()
    models.PricePolicy.objects.create(price=15.9, period=60, content_object=obj2)
	#创建3个月的价格
    obj3 = models.DegreeCourse.objects.filter(title="python全栈").first()
    models.PricePolicy.objects.create(price=21.9, period=90, content_object=obj3)
    return HttpResponse("200 OK")
添加成功:

快速反向查找:
#需要在models.py被查找的表中添加字段:
price_policy_list = GenericRelation("PricePolicy")#仅仅用于反向查找,不生成字段
#在views.py
#获取所有课程的价格策略:
dero = models.DegreeCourse.objects.fliter(id=1).frist()
price_policys=dero.price_policy_list.all()
#获取到每个价格对象.
print(price_policys)#<QuerySet [<PricePolicy: PricePolicy object>, <PricePolicy: PricePolicy object>, <PricePolicy: PricePolicy object>]>
												
											Django:内置组件Content-Type的更多相关文章
- django内置组件——ContentTypes
		
一.什么是Django ContentTypes? Django ContentTypes是由Django框架提供的一个核心功能,它对当前项目中所有基于Django驱动的model提供了更高层次的抽象 ...
 - Vue基础(环境配置、内部指令、全局API、选项、内置组件)
		
1.环境配置 安装VsCode 安装包管理工具:直接下载 NodeJS 进行安装即可,NodeJS自带 Npm 包管理工具,下载地址:https://nodejs.org/en/download/安装 ...
 - Django学习——ajax发送其他请求、上传文件(ajax和form两种方式)、ajax上传json格式、 Django内置序列化(了解)、分页器的使用
		
1 ajax发送其他请求 1 写在form表单 submit和button会触发提交 <form action=""> </form> 注释 2 使用inp ...
 - Django内置Admin
		
Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP: django.contrib.auth django.contrib.contenttyp ...
 - Django内置模版过滤器
		
Django内置过滤器总览 可以查询下表来总览Django的内置过滤器: 过滤器 说明 add 加法 addslashes 添加斜杠 capfirst 首字母大写 center 文本居中 cut 切除 ...
 - 框架----Django内置Admin
		
Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP: django.contrib.auth django.contrib.contenttyp ...
 - Django内置信号
		
阅读目录(Content) Django中内置的signal 自定义信号 1.定义信号 2.注册信号 3.触发信号 回到顶部(go to top) Django中内置的signal Django中提供 ...
 - Django内置Admin解析
		
Django 内置的admin是对于model中对应的数据表进行增删改查提供的组建 一.Django admin的内部依赖: 依赖的app django.contrib.auth django.con ...
 - form-create教程:给内置组件和自定义组件添加事件
		
本文将介绍form-create如何给内置组件和自定义组件添加事件 form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成器.并且支持生成任何 Vue ...
 
随机推荐
- xml报文标签替换正则表达式
			
写在前面 需求是把所有标签中的信息替换成指定内容 例如: <transName>交易名称</transName><aaa></aaaa><tran ...
 - Python知乎上推荐的项目
			
原文地址:https://www.zhihu.com/question/29372574/answer/88744491 作者:Wayne Shi链接:https://www.zhihu.com/qu ...
 - 取response里 Json格式的字段值
			
1.
 - TortoiseGit用户名密码的更换方法介绍
			
http://www.downza.cn/xy/53171.html 有时候因实际需求要更换TortoiseGit用户名密码,怎么办呢?下文就是TortoiseGit用户名密码的更换方法介绍,一起看看 ...
 - mvn命令修改pom打包的版本号
			
在java项目中打包经常需要修改镜像的版本号.可以使用如下命令 mvn versions: // 如果要打包使用人如下命令,打印详细信息使用 -X mvn clean deploy -e -Dskip ...
 - Openresty与Tengine
			
Tengine官方网站:http://tengine.taobao.org/index_cn.html OpenResty官方网站:http://openresty.org/ Openresty和Te ...
 - jquery ajax Uncaught TypeError :Illegal invocation 报错
			
使用jquery ajax异步提交的时候报Uncaught TypeError :Illegal invocation错误,报错如图: 基本上,导致这个错误的原因一般有以下两点: 1.请求类型有误,如 ...
 - Ubuntu宝塔面板设置网站 Apache Server API为Apache 2.0 Handler模式
			
用过宝塔面板(https://www.bt.cn)的谁用谁知道: 以下来自官网的介绍: “宝塔Linux面板是提升运维效率的服务器管理软件,支持一键LAMP/LNMP/集群/监控/网站/FTP/数据 ...
 - docker stack删除network失败
			
现象描述 删除stack的时候没太多提示,但再启动相同的stack会报错,提示网络创建失败:随后使用network ls命令可以看到之前的network还在: 使用docker network rm还 ...
 - Hadoop的三种调度器FIFO、Capacity Scheduler、Fair Scheduler(转载)
			
目前Hadoop有三种比较流行的资源调度器:FIFO .Capacity Scheduler.Fair Scheduler.目前Hadoop2.7默认使用的是Capacity Scheduler容量调 ...