Django创建应用、ORM的进阶使用及模型类数据库迁移
1 Django项目创建第一个应用
Django 项目就是基于 Django 框架开发的 Web 应用,它包含了一组配置和多个应用,我们把应用称之为 App,在前文中对它也做了相应的介绍,比如 auth、admin,它们都属于 APP。
一个 App 就是一个 Python 包,通常一个 App 可以包含模型、视图、模板和 URL 配置文件,可以被应用到多个 Django 项目中,因为它们的本质就是可被重用的 Python 软件包。
1.1 创建应用
Django 的设计目标是让开发者关注应用的功能逻辑的实现。
所以,创建应用的过程是非常简单的,利用 manage.py 提供的 startapp 命令就可以创建一个APP。
具体命令如下所示:
# 语法
# python manage.py startapp 应用名
python manage.py startapp index
startapp 同样也属于 manage.py 的子命令,用来创建 Django 的应用。
执行这个命令不会在命令行看到任何输出,但是可以在 manage.py 的同级目录下看到多出了一个 index 目录:
我们对这些文件做逐一的解释:
-
admin.py 用于将 Model 定义的数据表注册到管理后台,是 Django Admin 应用的配置文件
-
apps.py 用于应用程序本身的属性配置文件
-
models.py 用于定义应用中所需要的数据表
-
tests.py 文件用于编写当前应用程序的单元测试
-
views.py 用来定义视图处理函数的文件
-
一级目录下的
__init__.py
文件标识 index 应用是一个 Python 包 -
migrations 目录用于存储数据库迁移时生成的文件,该目录下的
__init__.py
文件标识 migrations 是一个 Python 包
这就是 index 应用涉及到的所有文件,当然在实际的开发工作中,该应用目录下的文件也不是一成不变的,开发者根据自己的需要会相应的增加文件或者子目录,比如 urls.py 文件或者存储静态文件的 static 目录等。所以大家千万不要认为 Django 框架自动生成的目录,无需我们做其他操作或者更改,这是使用 Django 的一个误区。
1.2 应用的添加
应用创建完成后,我们还需要在 settings.py 配置文件中对其进行添加。
我们已经对 INSTALLED_APPS 做了介绍,把我们创建的应用添加到这个列表,如下所示:
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','index',
]
用如上方式添加完成后,就可以让 index 应用的和整个项目融为一体了。
接下来,就可以正式进入开发应用阶段了,通过实现一些小的功能点,让我们更加全面的了解 Django 框架。
2 Django ORM进阶应用
ORM (Object Realtional Mapping)即对象关系映射,它是一种基于关系型数据库的程序技术。ORM 允许你使用类和对象对数据库进行操作,这大大提高了对数据库的控制,避免了直接使用 SQL 语句对数据库进行操作。这种程序技术的底层主要是通过映射机制实现的,有兴趣的可以自己研究一下!
Web 开发中对数据库的操作是必不可少的,然而每种数据库的操作方式以及用法不尽相同。由于 Django 中 ORM 的存在,为我们操作不同种类的数据库提供了统一的方法,ORM 适配了多种常用的关系型数据库,例如 PostgreSQL、MySQL、Oracle、Sqlite3 等。
2.1 Django中定义数据表
那么在 Django 中如何使用 ORM 模块来定义一张数据表呢?
在定义数据表之前,我们应该首先理解什么是模型类。
-
模型类
其实模型类本质上属于一个 Python 类,只不过在 Django 中称之为做模型类 ,它是由 django.db.models.Model 派生出的子类
通过上述介绍,我们可以这样理解:Django 中模型类就相当于 ORM 模块。
-
定义数据表
现在有一张用户信息表 UserInfo,它有两个字段 name 和 password,可以定义如下:
class UserInfo(models.Model):name = models.CharFiled(max_length=100)password = models.CharFiled(max_length=100)
通过以上代码,UserInfo 数据表就已经创建完成,我们对代码进行逐行解析:
-
第 1 行,使用 from django.db import models 导入 models 模块
-
第 2 行,使用 class 关键字对 UserInfo 表进行类定义,并继承了models 模块中的 Model 类
-
第3、4 行,数据表中的字段 name 和 password 是 UserInfo 类的属性,name 和 password 字段类型都是 CharFiled,字段长度均是100。
-
2.2 ORM定义项目数据表
下面我们用 ORM 定义 index 应用所需的数据表,首选找到 index 应用下的 models.py 文件。
在文件里添加如下代码:
from django.db import models
# Create your models here.
# 创建book表
class Book(models.Model):title = models.CharField(max_length=30, unique=True, verbose_name='书名')public = models.CharField(max_length=50, verbose_name='出版社')price = models.DecimalField(max_digits=7, decimal_places=2, verbose_name='定价')retail_price = models.DecimalField(max_digits=7, decimal_places=2, verbose_name='零售价', default="30")
def __str__(self):return "title:%s pub:%s price:%s" % (self.title, self.public, self.price)
# 创建作者表
class Author(models.Model): name = models.CharField(max_length=30, verbose_name='姓名')email = models.EmailField(verbose_name='邮箱')
def __str__(self):return '作者:%s' % self.name
# 创建用户信息表
class UserInfo(models.Model): username = models.CharField(max_length=24, verbose_name='用户注册')password = models.CharField(max_length=24, verbose_name='密码')
通过上述代码,我们定义了一个名叫 Book 的数据表。
数据表由以下字段构成书名(title)、出版社(public)、价格(price)、零售价(retail_price),而且对每个字段都做添加了相应的字段属性以及字段选项。
2.3 Filed的通用字段选项
Model 中添加的字段都是 Field 类型的实例,不同的 Field 类型可能会支持不同的字段选项,但是也有很多字段选项是通用的,即可以用在任何一种 Field 类型中。这里介绍一些常用且重要的通用字段选项,它们都有对应的默认值,这些字段选项都是可选的,理解这些有助于更好地使用它们。
-
blank
默认值是 False,设置为 True 时,字段可以为空。设置为 False 时,字段是必须填写的。如果是字符型字段 CharField 和 TextField,它们是用空字符串来存储空值的。
-
unique
默认值是 False,它是一个数据库级别的选项,规定该字段在表中必须是唯一的。
-
null
默认为 False,如果此选项为 False 建议加入 default 选项来设置默认值。如果设置为 True,表示该列值允许为空。日期型、时间型以及数字型字段不接受空字符串。所以当设置 IntegerField,DateTimeField 型字段可以为空时,需要将 blank 与 null 均设为 True 才可以。
-
db_index
默认值是 False,如果设置为 True,Django 则会为该字段创建数据库索引,如果该字段经常作为查询的条件,那么就需要设置 db_index 选项,从而加快数据的检索速度。
-
db_column
这个选项用于设置数据库表字段的名称。如果没有指定,Django 默认使用 Model 中字段的名字。
-
default
用于给字段设置默认值,该选项可以设置为一个值或者是可以调用对象,但不能是可变对象,不同字段类型默认值也不同,比如 BooleanFiled 布尔类型 default 值为Ture 或者 False。主要的使用场景是当一个字段的值被用户省略时,后台服务器自动为该字段的设置默认值。
-
primary_key
默认值是 False,如果设置为 True,表示该字段为主键,在 Django 中 默认 id 为主键,也就是说即使你的数据表中没有创建 id 字段,Django 也会自动为你创建 id 字段并将其设置为主键。如果你在表中设置了其他字段为主键的时,那么 Django 将取消为 id 字段设置主键。
-
choices
这个选项用于给字段设置可以选择的值。它是一个可迭代对象,即列表或者元组,其中每一个元素都是一个二元组(a,b)的形式,a 是用来选择的对象,b 是对 a 的描述信息。比如我们对某个人性别定义数据表如下所示:
# 创建表 class UserInfo(models.Model):# 定义chocies参数的对应关系,以元组(或者列表)的形式进行表述:choices = ((male, '男性'),(female, '女性'),)gender = models.CharField(max_length=2,choices = choices,default='male')
-
verbose_name
设置此字段在 admin 后台管理系统界面上的显示名称,如果没有设置这个字段,Django 将会直接展示字段名并且将字段中的下划线转变为空格。
3 index应用数据库迁移
上面我们创建好了 index 应用所需的数据表,下一步就是执行数据库的迁移,之后让我们再来看一下又有什么新的变化发生呢?数据库迁移的两个命令分步骤执行,如下所示:
python manage.py makemigrations
python manage.py migrate
执行完毕后会在命令行得到如下输出:
若迁移过程中出现报错提示,首先检查您的 models.py 文件是否正确书写,除此之外,也可能由于 Django 与 MySQL 版本问题导致报错。
从上述输出结果可以看出,我们对 index 应用进行了数据库迁移工作。
并且在数据库中创建了三张表,分别是 Author、Book、UserInfo。
而且在 index 应用下的 migrations 目录下生还成了一个 0001_initial.py 的文件:
这个迁移文件包含了创建数据表时用到的所有信息,这是一个临时的过度文件。
4 魔术方法__str__
__str__
方法是 Python 中的 "魔术” 方法,它是为 print 这样的打印函数设计的,它属于 python 的 object 基类的一个方法,也就是说 python 所有的类都有该方法,当然 Django 的 modle 类也有。如果没有这个方法定义,打印对象会显示对象的内存地址,但是这样的显示方式不够友好,且不利于调试,而用 __str__
方法后,可以在 print 时得到易于人阅读的信息,在如下所示:
# 直接print打印
class TestClass:def __init__(self):self.name = 'testcase't = TestClass() #实例化对象
print(t) # 结果显示:<__main__.TestClass object at 0x8f5c27b42367>
# __str__方法
class TestClass:def __init__(self):self.name = '小明'def __str__(self):return self.name
t = TestClass() #实例化对象
print(t) # 结果显示:小明
本节内容为 index 应用创建了数据表,并且一步步带领大家实现了如何自定义模型类以及完成了数据表的迁移的,而且对产生的迁移文件也做了介绍,接下来我们将学习 Django 的后台管理系统,看看它是如何配合 ORM 使用的。
5 Django Admin数据表可视化
Django 的后台管理系统是非常出色的,新建项目以后,Django 就为我们设置好了后台管理系统的各种功能。
5.1 后台管理系统的重要性
我们知道,Web 站点上某些内容的改动是后台管理员来完成的,如果管理员直接用 Shell 或者 SQL 语句来修改,不仅麻烦,而且容易操作失误,从而导致数据不一致的结果。假如是一个不懂编程的人呢?应该怎么去操作呢?上述问题,说明了构建一个后台管理系统的重要性,通过后台管理系统为管理员提供一种便捷有效的操作方式。
后台管理系统主要是对数据表的存储做专门的管理,例如针对微博或者论坛类的站点,管理员需要删除不合规的文章,或者公司内部需要发布新的话题等,这些都是通过数据表的管理实现的。单一功能的后台系统比较容易构建,但是如果功能增多情况下,就需要对多个数据表做管理,这就增加了开发人员的重复性工作。Django 提供的后台管理系统很好的解决了这个问题。
5.2 创建超级用户
通过命令创建超级管理员账户,命令如下所示:
python manage.py createsuperuser --username=admin --email=admin@163.com
这里将用户名设置为 admin,邮箱设置为 admin@163.com,也可以根据自己的需要去修改。如果在 createsuperuser 后面不加任何内容,Django 会提示用户输入用户名和邮箱。当前命令执行后,需要重复输入两次密码,密码可以根据自己的需要设置,但是密码不能过于简单。
如下图所示,表示创建成功:
注意:输入密码的时候,不会显示。
注意:超级用户拥有所有权限,方便技术人员或非技术人员以可视化的形式对应用数据记录实现增删改查的操作。
启动 BookStore 项目,然后在浏览器地址栏输入 127.0.0.1:8000/admin 访问,输入刚刚创建的超级用户名以及密码进行登录。如下所示登录成功:
5.3 将Model注册到管理后台
-
在admin.py文件中声明
那么如何把自定义的数据表 Model 注册到管理后台呢?
也就是说要把 Model 显示在 Admin 后台管理系统界面,需要做哪些操作呢?
当我们使用 startapp 命令创建 index 应用的时候会自动创建 admin.py 文件,想要把自定义的 Model 注册到管理后台,就需要在 admin.py 文件中进行声明,添加如下代码:
from django.contrib import admin #Django自动在admin.py文件中导入 from index.models import Book, Author,UserInfo #这个需要我们自己导入相应的模型类(数据表) admin.site.register([Book,Author,UserInfo])
通过上述代码,我们就完成了将 Model 注册到后台管理系统的操作,其实实现的过程也非常的简单,首先通过 django.contrib 的标准库引入 admin 应用,然后把 index 应用下我们自定义的三张数据表引入,最后我们调用 admin.site.register() 方法实现模型类的注册。多个模型类一起注册我们使用列表的形式来统一注册,如果是单一的模型类注册,我们可以使用以下方式即可:
admin.site.register(Book)
至此我们就完成了数据表在 Admin后台管理系统的可视化操作,我们再次使用
ctrl+F5
刷新后台管理系统的显示页面,可以得到如下结果: - 提示:图中每张数据表的名字都加上了s,这是Django自动设定的,我们可以通过相应的修改将其去掉,在后续章节我们将介绍。
虽然看似页面简单并且没有太多的附加功能,但是对于简单的增删改操作而言已经足够使用了。我们打开其中的 UserInfos 数据表来查看,如下所示:
- 点击增加 USERI INFO 按钮会得到如下页面,在此页面我们可以进行数据的添加、编辑、保存操作:
相关文章:
Django创建应用、ORM的进阶使用及模型类数据库迁移
1 Django项目创建第一个应用 Django 项目就是基于 Django 框架开发的 Web 应用,它包含了一组配置和多个应用,我们把应用称之为 App,在前文中对它也做了相应的介绍,比如 auth、admin,它们都属于 APP。 一个 App 就是一…...
tcpdump 如何使用
tcpdump 是一个在Unix和类Unix系统上运行的网络抓包工具,它用于捕获网络流量并将其转储到文件中以供后续分析。tcpdump非常强大,可以用于监控、调试和分析网络通信,用于排查网络问题以及安全审计。以下是关于如何使用tcpdump的详细介绍&#…...
goweb入门
创建gomod项目 go mod init web01新建main.go package mainimport ("fmt""net/http" )func handler(writer http.ResponseWriter, request *http.Request) {fmt.Fprintf(writer, "Hello World,%s!", request.URL.Path[1:]) } func main() {fmt…...
【python爬虫】批量识别pdf中的英文,自动翻译成中文下
不管是上学还是上班,有时不可避免需要看英文文章,特别是在写毕业论文的时候。比较头疼的是把专业性很强的英文pdf文章翻译成中文。我记得我上学的时候,是一段一段复制,或者碰到不认识的单词就百度翻译一下,非常耗费时间。之前的文章提供了批量识别pdf中英文的方法,详见【…...
YApi 新版如何查看 http 请求数据
YApi 新版如何查看 http 请求数据 因chrome 安全策略限制,在 cross-request 升级到 3.0 后, 不再支持文件上传功能,并且需要通过以下方法查看 network:1.首先在chrome 输入 > chrome://extensions打开扩展页2.开启开发者模式3.点击 cross…...
自动驾驶(apollo)
💓博主csdn个人主页:小小unicorn 🚚代码仓库:小小unicorn的代码仓库🚚 🌹🌹🌹关注我带你学习编程知识 自动驾驶技术 引言自动驾驶的基本原理自动驾驶的技术挑战自动驾驶的潜在影响结…...
web3.0涉及的技术
非同质化代币 非同质化代币(Non-Fungible Tokens,NFTs)是一种数字资产,与传统的加密货币(如比特币或以太币)不同,它们具有独特性和不可替代性。NFTs 是基于区块链技术的数字资产,用…...
26. 不相同的字符串(第一期模拟笔试)
题目:样例: 输入 1 abab 输出 2 思路: 这里的题目要求我们要最少操作删除次数,我们可以先统计每个字符个数,然后开始删除,每操作删除一次,就会产生一个新字符,ans r[i] >> 1…...
Rethink LSTMGRU
LSTM 设计思想 姑且不看偏置。 W W W 和 U U U 是加权的矩阵,写模型的时候用 nn.Linear(in_dim, out_dim) 就成; σ \sigma σ 是 Sigmoid 函数 第一条,遗忘门,定义为 有多少内容需要被遗忘;第二条:输入门…...
状态管理艺术——借助Spring StateMachine驭服复杂应用逻辑
文章目录 1. 什么是状态2. 有限状态机概述3. Spring StateMachine4. Spring StateMachine 入门小案例4.1 接口测试 5. 总结 1. 什么是状态 在开发中,无时无刻离不开状态的一个概念,任何一条数据都有属于它的状态。 比如一个电商平台,一个订…...
获取和设置小程序和h5的页面栈
获取页面栈: 语法: let pages getCurrentPages(); 设置页面栈: 小程序语法: pages.data H5语法: pages let pages getCurrentPages(); let page pages[pages.length - 2]; if(page.route "pages/conf…...
Mysql基于成本选择索引
本篇文章介绍mysql基于成本选择索引的行为,解释为什么有时候明明可以走索引,但mysql却没有走索引的原因 mysql索引失效的场景大致有几种 不符合最左前缀原则在索引列上使用函数或隐式类型转换使用like查询,如 %xxx回表代价太大索引列区分度过…...
Element-ui container常见布局
1、header\main布局 <template> <div> <el-container> <el-header>Header</el-header> <el-main>Main</el-main> </el-container> </div> </template> <style> .el-header { …...
ssm实现折线统计图
方法1:单张数据表中的数据图表生成 图表统计,查看部门人数统计这里实现的时单张表中的数据实现部门人数折线统计图展示。 <script type"text/javascript">// 利用AjAx来获取后台传入的数据(Responsebody注解传入的&…...
GLSL ES着色器 精度限定字
目录 前言 WebGL支持的三种精度 数据类型的默认精度 float类型没有默认精度 预处理指令 在GLSL ES中常用的三种预处理指令。 预定义的内置宏 前言 GLSL ES新引入了精度限定字,目的是帮助着色器程序提高运行效率,削减内存开支。顾名思义…...
webrtc的FULL ICE和Lite ICE
1、ICE的模式 分为FULL ICE和Lite ICE: FULL ICE:是双方都要进行连通性检查,完成的走一遍流程。 Lite ICE: 在FULL ICE和Lite ICE互通时,只需要FULL ICE一方进行连通性检查, Lite一方只需回应response消息。这种模式对于部署在公网…...
flink的几种常见的执行模式
背景 在运行flink时,我们经常会有几种不同的执行模式,比如在IDE中启动时,通过提交到YARN上,还有通过Kebernates启动时,本文就来记录一下这几种模式 flink的几种执行模式 flink嵌入式模式: 这是一种我们在…...
蓝桥杯备赛Day8——队列
大家好,我是牛哥带你学代码,本专栏详细介绍了蓝桥杯备赛的指南,特别适合迎战python组的小白选手。专栏以天作为单位,定期更新,将会一直更新,直到所有数据结构相关知识及高阶用法全部囊括,欢迎大家订阅本专栏! 队列也属于基础数据结构。 队列概念 队列是一种数据结构,…...
用滑动条做调色板---cv2.getTrackbarPos(),cv2.creatTrackbar()
滑动轨迹栏作调色板 cv.createTrackbar(‘R’, ‘image’, 0, 255, nothing) 参数:哪个滑动轨迹栏,哪个窗口,最小值,最大值,回调函数 cv.getTrackbarPos(‘R’, ‘image’) 参数:轨迹栏名,窗口…...
dubbo 服务注册使用了内网IP,而服务调用需要使用公网IP进行调用
一、问题描述: 使用dubbo时,提供者注册时显示服务地址ip为[内网IP:20880],导致其他消费者在外部连接的情况下时,调用dubbo服务失败 二、解决办法 方法一、修改hosts文件 (1). 先查询一下服务器的hostna…...
外传-Midjourney的局部重绘功能
今天在抄袭。。。啊不,借鉴 midjourney 官网教程的时候,发现多了一个 局部重绘的功能,意外发觉还不错,分享一下用法。 先给大家说一下,我这段时间都在学习 SD,局部重绘是基操,而 MJ 一直是次次…...
Spring Boot 中使用 Poi-tl 渲染数据并生成 Word 文档
本文 Demo 已收录到 demo-for-all-in-java 项目中,欢迎大家 star 支持!后续将持续更新! 前言 产品经理急冲冲地走了过来。「现在需要将按这些数据生成一个 Word 报告文档,你来安排下」 项目中有这么一个需求,需要将用户…...
Java基础(二十一)十点半游戏
十点半游戏 十点半是一种流行的纸牌游戏,可以说是一种变体的二十一点游戏。游戏的规则是,每个玩家根据所拿到的牌点数的总和来决定是否继续要牌。目标是尽量接近但不超过十点半的点数,超过十点半即为爆牌。如果两名玩家都未爆牌,…...
第8节-PhotoShop基础课程-常用快捷键汇总
文章目录 前言1.工具栏1.移动工具 V2.矩形框选工具 M3.套索工具 L4.魔棒工具 W5.裁剪工具 C6.吸管工具 I7.污点修复工具 J8.仿制图章工具 S9.历史记录画笔工具 Y10.橡皮檫工具 E11.油漆桶工具 G12 减淡工具 O13.钢笔工具 P14 横排文字工具 T15.路径选择工具 A16 椭圆工具 U17 抓…...
Redis带你深入学习数据类型set
目录 1、set 2、set相关命令 2.1、添加元素 sadd 2.2、获取元素 smembers 2.3、判断元素是否存在 sismember 2.4、获取set中元素数量 scard 2.5、删除元素spop、srem 2.6、移动元素smove 2.7、集合中相关命令:sinter、sinterstore、sunion、sunionstore、s…...
Json“牵手”易贝商品详情数据方法,易贝商品详情API接口,易贝API申请指南
易贝是一个可让全球民众在网上买卖物品的线上拍卖及购物网站,易贝(EBAY)于1995年9月4日由Pierre Omidyar以Auctionweb的名称创立于加利福尼亚州圣荷塞。人们可以在易贝上通过网络出售商品。2014年2月20日,易贝宣布收购3D虚拟试衣公…...
《AI一键生成抖音商品种草文案》让你秒变带货王!
在这个数字化的时代,我们的生活被各种应用所包围,其中,抖音作为一款短视频分享平台,已经成为了我们生活中不可或缺的一部分。然而,作为一名抖音创作者,你是否曾经遇到过这样的困扰:在创作商品种…...
博客系统(升级(Spring))(二)获取当前用户信息、对密码进行加密、设置统一数据格式、设置未登录拦截、线程池
博客系统(二) 博客系统获取当前用户的信息对密码进行加密和解密的操作设置统一的数据返回格式设置未登录拦截设置线程池 博客系统 博客系统是干什么的? CSDN就是一个典型的博客系统。而我在这里就是通过模拟实现一个博客系统,这是…...
Postman接口测试工具
Postman接口测试工具 Postman简介Postman 发送一个请求postman创建一个集合Postman 快捷键Postman设置postman请求postman历史postman请求排错postman集合简介postman创建和共享集合postman管理集合postman数据导入导出postman测试脚本postman环境变量和全局变量...
appium+jenkins实例构建
自动化测试平台 Jenkins简介 是一个开源软件项目,是基于java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。 前面我们已经开完测试脚本,也使用bat 批处…...
西部数码网站管理助手 数据库/昆明自动seo
使用内存监测工具 DDMS –> Heap操作步骤1.启动eclipse后,切换到DDMS透视图,并确认Devices视图、Heap视图都是打开的,没打开的直接Window>ShowView>自己选2.将手机通过USB链接至电脑,链接时需要确认手机是处于“USB调试”…...
打造自己的网站/网络营销软件条件
有时候 go get 比较慢,可以考虑用迅雷等下载工具下载下来,然后再本地安装, 如:code.google.com/p/go.net/websocket,如何安装这些离线包? 先在你的 GOPATH 目录(如果不懂 GOPATH,请先…...
网站建设 插入图片/广告联盟下载app
#!/bin/bash #功能:让GBK编码的文件可以使用less正常显示中文(自动识别GBK和UTF-8编码) #v0.1 在LINUX下,使用UTF-8编码,less UTF-8的文件时显示中文正常,而less GBK的文件时将显示乱码, #本脚本使用enca识别编码(enca…...
wordpress网站目录/今日军事新闻头条视频
GIT本地回退版本并且更新远程仓库 当不小心向远程仓库比如github做了一次错误的提交,想使本地和仓库回到某一个历史版本怎么办? 首先根据提交记录找到你想要回到的commit id(版本号) 然后回退到这个版本 git reset --hard 3628164…...
微信息公众平台微网站建设/网络营销推广总结
典型的业务逻辑,诸如过滤器(filters)和计算(calculations)常被应用在业务视图中,在一些情况下实现这些业务逻辑是很有意义的,并且它的性能和维护成本很低的。 为模型添加过滤器 IBM Cognos Framework Manager(FM)的两种过滤器形式: 嵌入式过滤…...