django学习系列之数据库篇

来源:互联网 发布:程序员鼓励师 招聘 编辑:程序博客网 时间:2024/05/19 08:26

涉及到数据库,肯定是创建好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模块等同于下面这张表(PostgresqlCREATE 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 modelsclass 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()方法。

哦,这里解释一下objectsobjects其实是对象的管理器,在操作数据的时候可以用它。

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()方法就搞定了。

今天就先写到这里吧。


0 0
原创粉丝点击