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模块等同于下面这张表(用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 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()方法。
哦,这里解释一下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学习系列之数据库篇
- django学习系列之视图篇
- django学习系列之模板系统篇(一)
- django学习系列之模板系统篇(二)
- Django学习笔记之【Django与数据库交互】
- DJANGO基础学习之数据库操作
- Django学习之数据库的链接详解
- django系列学习-前言
- Django学习系列(一)--安装Django
- Django数据库之一对一
- python学习之--Django--连接数据库mysql创建model
- Django学习之路(六)Models和数据库
- Django开发系列之二
- Django模板系列之六
- Django学习笔记之【Forms篇】
- django学习之学前准备篇
- django学习之路
- 喜欢你 那双眼动人笑声更迷人。
- ubuntu14.04双显卡解决方案,本人亲测,完美解决
- 4.4 函数返回值
- iOS开发教程:Storyboard全解析-第一部分
- iOS开发教程:Storyboard全解析-第二部分
- django学习系列之数据库篇
- SQL查询归纳
- Python资料
- NYOJ 73 比大小
- Xcode4.2开发入门之一些变化
- 一些相关注意问题(MFC)
- Enable C++11 in gcc
- Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse
- mciSendString 和 mciSendCommand 函数的简单使用