-
涉及到数据库,肯定是建立好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()方法就搞定了。
今天就先写到这里吧。
django学习系列之数据库篇
最新推荐文章于 2024-08-26 00:22:08 发布