先看看效果图,现价买入

先看看效果图

学习地址

首先声明两个重要点: 

Django教程–model教程

经过前面几节,我们已经简单的了解了在Django中如何进行模板渲染、参数和文件的提交以及参数验证等,对于网站而言,说白了其实就是数据的保存、处理以及展示,前面我们已经涉及了数据的展示以及提交,今天我们就来了解下Django中的数据存储。
现在,大多数网站开发不会再直接使用数据库驱动来进行编程,而是使用一种对象到数据的映射框架来操作数据库,这种框架即为ORM。ORM框架使得开发者不必过多的关注数据库操作上,而是可以更多的把精力放在对于现实世界的建模上,同时提供统一的数据库访问操作,使得项目更容易移植和维护。
在Django中,model承担了ORM这一职责,model的思想和使用类似于j2ee中的hibnerate框架,只需要建立对象,即可自动建立好数据表结构,同时提供了对数据库的增删改查等操作,同时还承担数据的缓存以及数据库连接等职责。今天我们就来了解下如何使用model。
1.model字段
2.model基本创建
3.model简单增删改查


下载App:MT4

图片 1

C#有用的网站
  • C# Programming Guide – 介绍了有关关键的 C# 语言特征以及如何通过
    .NET 框架访问 C# 的详细信息。
  • Visual Studio – 下载作为 C# 集成开发环境的 Visual Studio
    的最新版本。
  • Go Mono – Mono
    是一个允许开发人员简单地创建跨平台应用程序的软件平台。
  • C Sharp (programming language) – 维基百科解释 C#。

下面列出 C# 一些重要的功能:

  • 布尔条件(Boolean Conditions)
  • 自动垃圾回收(Automatic Garbage Collection)
  • 标准库(Standard Library)
  • 组件版本(Assembly Versioning)
  • 属性(Properties)和事件
  • 委托(Delegates)和事件管理(Events Management)
  • 易于使用的泛型
  • 索引器
  • 条件编译(Conditional Compilation)
  • 简单的多线程(Multithreading)
  • LINQ 和 Lambda 表达式
  • 集成 Windows

1本书是作者的给自己的教程,而非给读者的教程。

model字段

model提供了各种各样的字段用来完成对象到数据表的映射,我们先来了解下几种常见的字段。
1、models.AutoField  自增列= int(11)
  如果没有的话,默认会生成一个名称为 id
的列,如果要显示的自定义一个自增列,必须将给列设置为主键
primary_key=True。
2、models.CharField  字符串字段
  必须 max_length 参数
3、models.BooleanField  布尔类型=tinyint(1)
  不能为空,Blank=True
4、models.ComaSeparatedIntegerField  用逗号分割的数字=varchar
  继承CharField,所以必须 max_lenght 参数
5、models.DateField  日期类型 date
  对于参数,auto_now =True则每次更新都会更新这个时间;auto_now_add
则只是第一次创建添加,之后的更新不再改变。
6、models.DateTimeField  日期类型 datetime
  同DateField的参数
7、models.Decimal  十进制小数类型= decimal
  必须指定整数位max_digits和小数位decimal_places
8、models.EmailField  字符串类型(正则表达式邮箱)=varchar
  对字符串进行正则表达式
9、models.FloatField  浮点类型= double
10、models.IntegerField  整形
11、models.BigIntegerField  长整形
  integer_field_ranges ={
    ’SmallIntegerField’:(-32768,32767),
    ’IntegerField’:(-2147483648,2147483647),
    ’BigIntegerField’:(-9223372036854775808,9223372036854775807),
    ’PositiveSmallIntegerField’:(0,32767),
    ’PositiveIntegerField’:(0,2147483647),
  }
12、models.IPAddressField  字符串类型(ip4正则表达式)
13、models.GenericIPAddressField  字符串类型(ip4和ip6是可选的)
  参数protocol可以是:both、ipv4、ipv6
  验证时,会根据设置报错
14、models.NullBooleanField  允许为空的布尔类型
15、models.PositiveIntegerFiel  正Integer
16、models.PositiveSmallIntegerField  正smallInteger
17、models.SlugField  减号、下划线、字母、数字
18、models.SmallIntegerField  数字
  数据库中的字段有:tinyint、smallint、int、bigint
19、models.TextField  字符串=longtext
20、models.TimeField  时间 HH:MM[:ss[.uuuuuu]]
21、models.URLField  字符串,地址正则表达式
22、models.BinaryField  二进制
23、models.ImageField图片
24、models.FilePathField文件
对于不同的字段,还有以下几种参数用来配置各种属性
1、null=True
  数据库中字段是否可以为空
2、blank=True
  django的 Admin 中添加数据时是否可允许空值
3、primary_key = False
  主键,对AutoField设置主键后,就会代替原来的自增 id 列
4、auto_now 和 auto_now_add
  auto_now 自动创建—无论添加或修改,都是当前操作的时间
  auto_now_add 自动创建—永远是创建时的时间
5、choices
GENDER_CHOICE = (
(u’M’, u’Male’),
(u’F’, u’Female’),
)
gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
6、max_length
7、default  默认值
8、verbose_name  Admin中字段的显示名称
9、name|db_column  数据库中的字段名称
10、unique=True  不允许重复
11、db_index = True  数据库索引
12、editable=True  在Admin里是否可编辑
13、error_messages=None  错误提示
14、auto_created=False  自动创建
15、help_text  在Admin中提示帮助信息
16、validators=[]
17、upload_to 文件上传位置

图片 2

图片 3

.Net 框架(.Net Framework)

.Net 框架由一个巨大的代码库组成,用于 C# 等客户端语言。下面列出一些
.Net 框架的组件:

  • 公共语言运行库(Common Language Runtime – CLR)
  • .Net 框架类库(.Net Framework Class Library)
  • 公共语言规范(Common Language Specification)
  • 通用类型系统(Common Type System)
  • 元数据和组件(Assemblies)
  • Windows 窗体(Windows Forms)
  • ASP.Net 和 ASP.Net AJAX
  • ADO.Net
  • Windows 工作流基础(Windows Workflow Foundation – WF)
  • Windows 显示基础(Windows Presentation Foundation)
  • Windows 通信基础(Windows Communication Foundation – WCF)
  • LINQ

以下几点值得注意:

  • C# 是大小写敏感的。
  • 所有的语句和表达式必须以分号结尾。
  • 程序的执行从 Main 方法开始。
  • 与 Java 不同的是,文件名可以不同于类的名称。

图片 4保留关键字图片 5上下文关键字

在 C# 中,变量分为以下几种类型:

  • 值类型(Value types)
  • 引用类型(Reference types)
  • 指针类型(Pointer types)

2作者在写本书前对语法一窍不通。

本书只想让读者<zuozhe>明白两件事情:

1,教是最好的学

2,要对事情足够重视,

model基本创建

接下来我们先用个小例子来简单了解下model的创建,我们现在的需求是要保存学生以及学生所选的课程信息,在Django中我们可以这样创建model,接着上节的PostParams工程,我们在其models.py下添加以下代码(Django中模型通常写在models.py文件下)

from django.db import models

# Create your models here.
class Course(models.Model):
    name=models.CharField(max_length=20,verbose_name='course name')
class Student(models.Model):
    name=models.CharField(max_length=20,verbose_name='student name')
    stuno=models.CharField(max_length=10,verbose_name='student no')
    courses=models.ManyToManyField(Course,verbose_name='study course',blank=True,null=True)

为了方便起见,我们省略其他属性。
可以看到,我们需要建立一个继承models.Model的class来创建model,然后使用上面提到的各种字段来完成对现实世界的建模,即抽象出对象。对于本例,每个学生都有姓名和学号属性,对于课程有name属性。学生学习课程通过外键来进行关联,由于一个学生可以学习多种课程,一个课程可以有多个学生,所以学生和课程间属于多对多映射关系,使用ManyToManyField。学生也可以不学任何课程(我们不能强求啊),所以属性设置为null和blank为True。对于一个model如果我们不显示设置主键,会为我们自动添加一个id的自增长字段作为主键,本例就是这样。
完成以上代码,我们需要通过命令来完成数据库的同步(Django1.7及以上集成了数据库版本迁移以及版本控制工具,1.7以下需要安装django-south),对于1.7及以上我们使用以下命令:

python manage.py makemigrations

接下来执行数据库同步命令

python manage.py migrate

执行完以上命令后即会在数据库中建好相应的表结构。

登陆账户

指针类型(Pointer types)

指针类型变量存储另一种类型的内存地址。C# 中的指针与 C 或 C++
中的指针有相同的功能。声明指针类型的语法:

type* identifier

类型转换从根本上说是类型铸造,或者说是把数据从一种类型转换为另一种类型。在
C# 中,类型铸造有两种形式:

  • 隐式类型转换 – 这些转换是 C# 默认的以安全方式进行的转换,
    不会导致数据丢失。例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。
  • 显式类型转换 –
    显式类型转换,即强制类型转换。显式转换需要强制转换运算符,而且强制转换会造成数据丢失。

一个变量只不过是一个供程序操作的存储区的名字。在 C#
中,每个变量都有一个特定的类型,类型决定了变量的内存大小和布局。范围内的值可以存储在内存中,可以对变量进行一系列操作。

常量是固定值,程序执行期间不会改变。常量可以是任何基本数据类型,比如整数常量、浮点常量、字符常量或者字符串常量,还有枚举常量。常量可以被当作常规的变量,只是它们的值在定义后不能被修改。

其他运算符下表列出了 C# 支持的其他一些重要的运算符,包括 sizeof、typeof
和 ? :。

图片 6

添加:?? 运算符称作 null 合并运算符。 如果此运算符的左操作数不为
null,则此运算符将返回左操作数;否则返回右操作数。

判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句和条件为假时要执行的语句。

图片 7图片 8图片 9

封装
被定义为”把一个或多个项目封闭在一个物理的或者逻辑的包中”。在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。C#
封装根据具体的需要,设置使用者的访问权限,并通过 访问修饰符 来实现。一个
访问修饰符 定义了一个类成员的范围和可见性。C#
支持的访问修饰符如下所示:

  • public:所有对象都可以访问;
  • private:对象本身在对象内部可以访问;
  • protected:只有该类对象及其子类对象可以访问
  • internal:同一个程序集的对象可以访问;
  • protected internal:访问限于当前程序集或派生自包含类的类型。

ref和out的区别在C#
中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持该更改。若要通过引用传递参数,
可使用ref或out关键字。ref和out这两个关键字都能够提供相似的功效,其作用也很像C中的指针变量。它们的区别是:1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。out方法参数上的
out
方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。当希望方法返回多个值时,声明
out 方法非常有用。使用 out
参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out
参数。若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out
参数的值不会传递到 out 参数。不必初始化作为 out
参数传递的变量。然而,必须在方法返回之前为 out
参数赋值。属性不是变量,不能作为 out 参数传递。

C# 提供了一个特殊的数据类型,nullable
类型,可空类型可以表示其基础值类型正常范围内的值,再加上一个 null
值。声明一个 nullable 类型的语法如下:

< data_type> ? <variable_name> = null;

Null 合并运算符Null 合并运算符用于定义可空类型和引用类型的默认值。Null
合并运算符为类型转换定义了一个预设值,以防可空类型的值为 Null。Null
合并运算符把操作数类型隐式转换为另一个可空的值类型的操作数的类型。例如:int
y = x ?? 1;假设此时x == null ,那么就将1赋值给y;

数组是一个存储相同类型元素的固定大小的顺序集合。数组是用来存储数据的集合,通常认为数组是一个同一类型变量的集合。所有的数组都是由连续的内存位置组成的。最低的地址对应第一个元素,最高的地址对应最后一个元素。

图片 10

  • 类的 构造函数
    是类的一个特殊的成员函数,当创建类的新对象时执行。构造函数的名称与类的名称完全相同,它没有任何返回类型。默认的构造函数没有任何参数。但是如果你需要一个带有参数的构造函数可以有参数,这种构造函数叫做参数化构造函数。
  • 类的 析构函数
    是类的一个特殊的成员函数,当类的对象超出范围时执行。析构函数的名称是在类的名称前加上一个波浪形作为前缀,它不返回值,也不带任何参数。析构函数用于在结束程序(比如关闭文件、释放内存等)之前释放资源。析构函数不能继承或重载。例如:

 ~Line() //析构函数 { Console.WriteLine; }

一个 文件
是一个存储在磁盘中带有指定名称和目录路径的数据集合。当打开文件进行读写时,它变成一个
流。从根本上说,流是通过通信路径传递的字节序列。有两个主要的流:输入流
和 输出流。输入流用于从文件读取数据,输出流用于向文件写入数据。

图片 11

FileStream 类

图片 12

特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号来描述的。特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。.Net
框架提供了两种类型的特性:预定义特性和自定义特性。

  • 规定特性(Attribute)

[attribute(positional_parameters, name_parameter = value, ...)]element
  • 预定义特性(Attribute)1.AttributeUsage预定义特性 AttributeUsage
    描述了如何使用一个自定义特性类。它规定了特性可应用到的项目的类型。

[AttributeUsage( validon, AllowMultiple=allowmultiple, Inherited=inherited)]

2.Conditional这个预定义特性标记了一个条件方法,其执行依赖于指定的预处理标识符。它会引起方法调用的条件编译,取决于指定的值,比如
Debug 或 Trace。例如,当调试代码时显示变量的值。

[Conditional]

3.Obsolete这个预定义特性标记了不应被使用的程序实体。它可以让您通知编译器丢弃某个特定的目标元素。例如,当一个新方法被用在一个类中,但是您仍然想要保持类中的旧方法,您可以通过显示一个应该使用新方法,而不是旧方法的消息,来把它标记为
obsolete。

[Obsolete][Obsolete( message, iserror)]

反射指程序可以访问、检测和修改它本身状态或行为的一种能力。程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。优点:

  • 1、反射提高了程序的灵活性和扩展性。
  • 2、降低耦合性,提高自适应能力。
  • 3、它允许程序创建和控制任何类的对象,无需提前硬编码目标类。缺点:
  • 1、性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。
  • 2、使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。

model简单增删改查

接下来我们了解下如何进行简单的增删改查操作,在views.py新建视图函数createstudent,代码如下

def createstudent(request):
    Course.objects.all().delete()
    Student.objects.all().delete()
    course=Course(name='math')
    course.save()
    student=Student(name='xiao ming',stuno='12345')
    student.save()
    querystudent=Student.objects.get(name='xiao ming')
    querystudent.courses.add(course)
    querystudent.save()
    querystudent1 = Student.objects.filter(name='xiao ming')[0]
    courses=querystudent1.courses.all()
    return HttpResponse('name:'+querystudent1.name+'&stuno:'+querystudent1.stuno+"&course:"+courses[0].name)

为了简单演示,我们这里并没有传递数据而是直接建立对应的记录。
可以看到Django的查寻操作是通过model类属性objects完成的,而增删改通过对应数据记录调用相应函数完成(delete,save,update)。代码一开始先删除原有所有表中所有数据(objects.all()查询到所有数据记录,然后调用delete删除),然后新建数学课程和小明学生分别保存,接下来我们通过objects.get操作查询(为了演示),注意get操作必须保证能查询到对象的唯一性,即查询对象只能有一个,然后我们让其学习数学课程(多对多的保存,先了解,下节会详细讲解),然后我们再次查询小明学生,这次通过objects.filter来完成,objects.filter可以完成各种复杂的数据库查询操作,是主要查寻方式(下节会详细了解),他返回满足条件的所有数据列表,这里我们只取第一个,然后我们还需要查询小明学习的所有课程,(多对多的查询),最后返回查询到的信息。
添加相应的url拦截,代码如下

from django.conf.urls import patterns, include, url
from django.contrib import admin

from app.views import params_test, params_test_reg, params_post, form_view, createstudent

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'PostParams.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

    url(r'^admin/', include(admin.site.urls)),
    url(r'^params_test/$',params_test),
    url(r'^params_test_reg/str(?P<str>\w+)page(?P<page>\d+)/$',params_test_reg),
    url(r'^post/$',params_post),
    url(r'^form/$',form_view),
    url(r'^createstudent/$', createstudent),
)

然后我们启动服务器,访问http://127.0.0.1:8000/createstudent/即可看到查询信息。


本节我们简单了解了Django中model的字段以及创建model和其增删改查操作,相信大家都有所收获,在下一节中我们将会了解model的高级查询以及自定义操作,还有model如何快速的与表单结合,敬请期待。

图片 13

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注