django学习系列之数据库篇
2014-09-03 13:52
141 查看
涉及到数据库,肯定是建立好app了。
进入app的目录,看到文件如下:
__init__.py是整个模块的配置,其实也是空的;views.py是视图,以后会用到。还有一个,models.py,它正是今天的主角——数据模型,或者说数据库层。
这个文件是干什么用的呢?定义数据模型。简单地说,是定义数据库的表和索引的。
比如djangobook给的示例:
from django.db import models
# Create your models here.
class Publisher(models.Model):#每个数据模型都是django.db.models.Model的子类
name =models.CharField(max_length=30)
address =models.CharField(max_length=50)
city =models.CharField(max_length=60)
state_province =models.CharField(max_length=30)
country =models.CharField(max_length=50)
website = models.URLField()
有的读者可能疑问:这不是类吗?对,这就是类,还是模块呢!但是它翻译成数据库语法后大家就明白了。
Publisher模块等同于下面这张表(用Postgresql的CREATE TABLE语法描述):
CREATE TABLE "books_publisher"(
"id" serial NOT NULL PRIMARY KEY,
"name" varchar(30) NOT NULL,
"address" varchar(50) NOT NULL,
"city" varchar(60) NOT NULL,
"state_province" varchar(30)NOT NULL,
"country" varchar(50) NOT NULL,
"website" varchar(200) NOT NULL
);
定义好数据模型后,接着用命令操作一下。
python manage.py validate
#检查你的模型的语法和逻辑是否正确。如果没问题,你会看到0 errors found。
python manage.py sqlall books #books是app的名称
#生成CREATE TABLE语句
python manage.py syncdb
#创建表和索引
如果有兴趣可以在SQL客户端登录进数据库服务器查看刚才创建的数据表。启动django自带的命令行工具:python manage.py dbshell。
上面只是查看表,接下来讲数据访问。
打开python环境:python manage.py shell。
输入下面的内容:
>>> from books.models import Publisher
>>> p1 =Publisher(name='Michael', address='HEMC', city='Guangzhou',state_province='GD',country='China',website='http://www.mysite.com/')
>>> p1.save()
>>> publisher_list =Publisher.objects.all()
>>> publisher_list
[<Publisher: Publisher object>]
解释一下这段代码:
1.import 模型类,并传入每个字段值将其实例化。
2.调用对象的save()方法,将对象保存到数据库中。此时django会在后台执行一条insert语句。
3.使用属性Publisher.objects从数据库中获取对象。调用Publisher.objects.all()获取数据库中所有的Publisher对象。此时,Django在后台执行一条SELECT SQL语句。
我们可以看到,打印publisher_list时,并没有得到想要的有用的信息:[<Publisher:Publisher object>]。
这个问题很容易解决,只要添加一个方法__str__()到Publisher对象。__str__()方法告诉python怎样把对象当作字符串使用。将上面的代码改成:
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=30)
address =models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province =models.CharField(max_length=30)
country =models.CharField(max_length=50)
website = models.URLField()
def __str__(self):
return self.name #这里返回名字
要注意的是,__str__()必须返回字符串,如果是其他类型,python将会抛出TypeError错误消息"__str__ returned non-string"。
为了让修改生效,先退出python shell,然后再次进入,这时候打印publisher_list就是这样了:
[<Publisher: Michael>]
同时,上面也演示了怎么给django的模型添加行为,也就是定义方法。
插入数据和更新数据
调用对象的save()方法可以插入数据,也可以更新数据,怎么区分呢?请看下面:
>>> p1 =Publisher(name='Michael', address='HEMC', city='Guangzhou',state_province='GD',country='China',website='http://www.mysite.com/')
>>> p1.save()
这时候是插入数据。
但是如果这样:
>>> p1.name = 'ApressPublishing'
就是更新数据了。不用多解释,看实例相信能够看明白。
接下来说数据的具体操作。
1.查找全部前面用过了,就是Publisher.objects.all()方法。
哦,这里解释一下objects。objects其实是对象的管理器,在操作数据的时候可以用它。
2.数据过滤,也就是select部分数据,可以使用filter()方法。
比如>>>Publisher.objects.filter(name="Apress Publishing")
当然多个参数也可以,用逗号隔开就可以了。
3.获取单个对象,使用get()方法。
get()方法其实跟filter()是一样的用法,只是如果返回结果是多个对象或者没有返回结果就会抛出异常。
4.数据排序,使用order_by()方法,参数是字段名称,支持多参数。
但是每次都要order_by()一次太麻烦了,程序员应该发扬偷懒精神,缺省排序。
修改模型代码如下:
class Publisher(models.Model):
name = models.CharField(max_length=30)
address =models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province =models.CharField(max_length=30)
country =models.CharField(max_length=50)
website = models.URLField()
def __str__(self):
return self.name
class Meta:
ordering = ["name"]
这个ordering= ["name"]告诉django如果没有提供order_by(),就缺省按名称排序。
5.组合方法。
如果想要将筛选的数据进行排序,怎么办呢?像这样
>>>Publisher.objects.filter(country="U.S.A.").order_by("name")
将方法串起来就行了。
6.删除对象,调用对象的delete()方法就搞定了。
今天就先写到这里吧。
进入app的目录,看到文件如下:
__init__.py是整个模块的配置,其实也是空的;views.py是视图,以后会用到。还有一个,models.py,它正是今天的主角——数据模型,或者说数据库层。
这个文件是干什么用的呢?定义数据模型。简单地说,是定义数据库的表和索引的。
比如djangobook给的示例:
from django.db import models
# Create your models here.
class Publisher(models.Model):#每个数据模型都是django.db.models.Model的子类
name =models.CharField(max_length=30)
address =models.CharField(max_length=50)
city =models.CharField(max_length=60)
state_province =models.CharField(max_length=30)
country =models.CharField(max_length=50)
website = models.URLField()
有的读者可能疑问:这不是类吗?对,这就是类,还是模块呢!但是它翻译成数据库语法后大家就明白了。
Publisher模块等同于下面这张表(用Postgresql的CREATE TABLE语法描述):
CREATE TABLE "books_publisher"(
"id" serial NOT NULL PRIMARY KEY,
"name" varchar(30) NOT NULL,
"address" varchar(50) NOT NULL,
"city" varchar(60) NOT NULL,
"state_province" varchar(30)NOT NULL,
"country" varchar(50) NOT NULL,
"website" varchar(200) NOT NULL
);
定义好数据模型后,接着用命令操作一下。
python manage.py validate
#检查你的模型的语法和逻辑是否正确。如果没问题,你会看到0 errors found。
python manage.py sqlall books #books是app的名称
#生成CREATE TABLE语句
python manage.py syncdb
#创建表和索引
如果有兴趣可以在SQL客户端登录进数据库服务器查看刚才创建的数据表。启动django自带的命令行工具:python manage.py dbshell。
上面只是查看表,接下来讲数据访问。
打开python环境:python manage.py shell。
输入下面的内容:
>>> from books.models import Publisher
>>> p1 =Publisher(name='Michael', address='HEMC', city='Guangzhou',state_province='GD',country='China',website='http://www.mysite.com/')
>>> p1.save()
>>> publisher_list =Publisher.objects.all()
>>> publisher_list
[<Publisher: Publisher object>]
解释一下这段代码:
1.import 模型类,并传入每个字段值将其实例化。
2.调用对象的save()方法,将对象保存到数据库中。此时django会在后台执行一条insert语句。
3.使用属性Publisher.objects从数据库中获取对象。调用Publisher.objects.all()获取数据库中所有的Publisher对象。此时,Django在后台执行一条SELECT SQL语句。
我们可以看到,打印publisher_list时,并没有得到想要的有用的信息:[<Publisher:Publisher object>]。
这个问题很容易解决,只要添加一个方法__str__()到Publisher对象。__str__()方法告诉python怎样把对象当作字符串使用。将上面的代码改成:
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=30)
address =models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province =models.CharField(max_length=30)
country =models.CharField(max_length=50)
website = models.URLField()
def __str__(self):
return self.name #这里返回名字
要注意的是,__str__()必须返回字符串,如果是其他类型,python将会抛出TypeError错误消息"__str__ returned non-string"。
为了让修改生效,先退出python shell,然后再次进入,这时候打印publisher_list就是这样了:
[<Publisher: Michael>]
同时,上面也演示了怎么给django的模型添加行为,也就是定义方法。
插入数据和更新数据
调用对象的save()方法可以插入数据,也可以更新数据,怎么区分呢?请看下面:
>>> p1 =Publisher(name='Michael', address='HEMC', city='Guangzhou',state_province='GD',country='China',website='http://www.mysite.com/')
>>> p1.save()
这时候是插入数据。
但是如果这样:
>>> p1.name = 'ApressPublishing'
就是更新数据了。不用多解释,看实例相信能够看明白。
接下来说数据的具体操作。
1.查找全部前面用过了,就是Publisher.objects.all()方法。
哦,这里解释一下objects。objects其实是对象的管理器,在操作数据的时候可以用它。
2.数据过滤,也就是select部分数据,可以使用filter()方法。
比如>>>Publisher.objects.filter(name="Apress Publishing")
当然多个参数也可以,用逗号隔开就可以了。
3.获取单个对象,使用get()方法。
get()方法其实跟filter()是一样的用法,只是如果返回结果是多个对象或者没有返回结果就会抛出异常。
4.数据排序,使用order_by()方法,参数是字段名称,支持多参数。
但是每次都要order_by()一次太麻烦了,程序员应该发扬偷懒精神,缺省排序。
修改模型代码如下:
class Publisher(models.Model):
name = models.CharField(max_length=30)
address =models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province =models.CharField(max_length=30)
country =models.CharField(max_length=50)
website = models.URLField()
def __str__(self):
return self.name
class Meta:
ordering = ["name"]
这个ordering= ["name"]告诉django如果没有提供order_by(),就缺省按名称排序。
5.组合方法。
如果想要将筛选的数据进行排序,怎么办呢?像这样
>>>Publisher.objects.filter(country="U.S.A.").order_by("name")
将方法串起来就行了。
6.删除对象,调用对象的delete()方法就搞定了。
今天就先写到这里吧。
相关文章推荐
- django学习系列之数据库篇
- 【django 学习笔记】09-数据模型高级进阶
- 《WCF按部就班学习系列3_WCF数据契约概述》
- WorldWind学习系列十五:如何切割影像和DEM数据及其在WW中的应用配置
- ajax学习系列之十: 使用 JSON 进行数据传输
- Django学习笔记之【应用和数据模型】
- 姚编辑看教材系列文章之一 数据库篇
- 一步一步学习Winform系列3:新增记录——DataGridView的属性和数据banding
- (LINQ 学习系列)(6)Linq教程实例: 使用自写类代码来访问数据
- C#温故而知新学习系列之面向对象编程—3-类的数据成员
- JAVA与C#对照学习系列 —— 数据结构
- Android学习系列(20)--App数据格式之解析Json
- 转:C#数据结构和算法学习系列十----正则表达式
- 转:C#数据结构和算法学习系列九----String类和StringBuilder类
- WorldWind学习系列十三:地形数据(DEM)加载和应用(入门篇)
- [新手入门]快速学习 ADO.NET Entity Framework系列文章 #4 -- 数据新增、删除、修改(ObkectContext的 .SaveChange()方法)
- 一步一个脚印学习WCF系列之WCF概要—生成元数据与代理(五)
- 转:C#数据结构和算法学习系列十二----散列HashTable类
- 一步一个脚印学习WCF系列之WCF契约设计—3-复杂类型序列化之数据契约DataContractAttribute
- [JNI]学习笔记系列:二 基本数据类型,字符串,数据