通常来说处理数据库需要我们掌握许多复杂的SQL语句.但是在Django里,对象关系映射(ORM)帮我们处理这一切,包括通过模型创建数据库表.事实上,模型是描述你的数据模型/图表的一个Python对象.与以往通过SQL操作数据库不同,你只用使用Python对象就能操作数据库.在本章,我们将会学习如何设立数据库并为Rango建立模型.
6.1 Rango的需求
首先,让我们看看Rango的需求.下面列出了Rango数据关键的几个需求.
- Rango实际上是一个网页目录 - 一个包含其他我站链接的网站
- 有许多不同网站的目录,每个目录中包含许多链接.我们在第二章假设1对多关系.看下面的ER图.
- 一个目录要有名字,访问数和链接.
- 一个页面要有目录,标题,URL和一些视图.
6.2 告诉Django你的数据库
在你创造任何模型之前都要对你的数据库进行设置.在Django1.7,当你创建了一个项目,Django会自动在settings.py里添加一个叫做DATABASES的字典.它包含如下.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
能看到默认用SQLite3作为后端数据库.SQLite是个轻量级的数据库对我们开发很有用.我们仅仅需要设置DATABASE_PATH里的NAME键值对.其他引擎需要USER,PASSWORD,HOST和PORT等关键字.
6.3 创建模型
让我们为Rango创建两个数据模型.
在rango/models.py里,我们定义两个继承自djnago.db.models.Model的类.这两个类分别定义目录和页面.定义Category和Page如下.
class Category(models.Model):
name = models.CharField(max_length=128, unique=True)
def __unicode__(self): #For Python 2, use __str__ on Python 3
return self.name
class Page(models.Model):
category = models.ForeignKey(Category)
title = models.CharField(max_length=128)
url = models.URLField()
views = models.IntegerField(default=0)
def __unicode__(self): #For Python 2, use __str__ on Python 3
return self.title
当你定义了一个模型,你需要制定可选参数的属性以及相关的类型列表.Django提供了许多内建字段.一些常用的如下.
- CharField,存储字符数据的字段(例如字符串).max_length提供了最大长度.
URLField,和CharField一样,但是它存储资源的URL.你也可以使用max_length参数.
IntegerField,存储整数.
- DateField,存储Python的datetime.date.
查看Django documentation on model fields获取完整列表.
每个字段都有一个unique属性.如果设置为True,那么在整个数据库模型里它的字段里的值必须是唯一的.例如,我们上面定义的Category模型.name字段被设置为unique - 所以每一个目录的名字都必须是唯一的.
如果你想把这个字段作为数据库的关键字会非常有用.你可以为每个字段设置一个默认值(default=’value’),也可以设置成NULL(null=True).
Django也提供了连接模型/表的简单机制.这个机制封装在3个字段里,如下
- ForeignKey, 创建1对多关系的字段类型.
- OneToOneField,定义一个严格的1对1关系字段类型.
- ManyToManyFeild,当以多对多关系字段类型.
6.4 创建和迁移数据库
6.4.1 设置数据库并创建管理员
如果还没有设置数据库那么需要通过migrate
$ python manage.py migrate
在settings.py文件里设置的INSTALLED_APPS列表,它会初始化创建这些app的图表,例如auth,admin等等.在你的项目根目录里会创建db.sqlite文件.
现在你可以创建一个管理员来管理数据库.
$ python manage.py createsuperuser
管理员账户将会在Django管理界面登陆时使用.按照提示输入用户名,邮箱地址和密码.注意要记住用户名和密码.
6.4.2 创建/上传模型/表
当你更改模型的时候,你需要通过makemigrations进行修改,所以对于rango,我们需要:
$ python manage.py makemigrations rango
6.5 Django模型和Django Shell
在我们把注意力集中到Django管理界面之前,通过Django shell创建Django模型也是值得一试的 - 它对我们debug非常有用.下面我们将展示如何用这种方式来创建Category实例.
为了得到shell我们需要再一次调用Django项目根目录里的manage.py.
6.6 设置管理界面
Django最突出的一个特性就是它提供内建的网页管理界面,用来浏览和编辑存储在模型的数据,也可以与数据库图表交互.在settings.py文件里,注意到有一个默认安装的django.contib.adminapp,而且你的urls.py里也默认增加了admin/匹配.
开启Django服务:
$ python manage.py runserver
访问http://127.0.0.1:8000/admin/.可以用先前设置管理员账户的用户名和密码来登录Django管理界面.管理界面只包含Groups和Users图表以我们需要让Django包含rango模块.所以打开rango/admin.py输入如下代码:
from django.contrib import admin
from rango.models import Category, Page
admin.site.register(Category)
admin.site.register(Page)
上面代码会为我们在管理界面注册模型.如果我们想要其他模型,可以在admin.stie.register()函数里传递模型作为参数.
完成之后重新访问http://127.0.0.1:8000/admin/,你想回看到如下图案.
6.7 创建Population Script
往数据库里输入数据会非常麻烦.许多开发者会随机的往数据库里输入测试数据.如果你在一个小的开发团队里,每个人都得传点数据.最好是写一个脚本而不是每个人单独的上传数据,这样就可以避免垃圾数据的产生.所以我们需要为你的数据库创建 population script.这个脚本自动的为你的数据库生成测试数据.
我们需要在Django项目的根目录里创建population script(例如<workspace>/tango_with_django_project/)
.创建populate_rango.py文件代码如下.
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tango_with_django_project.settings')
import django
django.setup()
from rango.models import Category, Page
def populate():
python_cat = add_cat('Python')
add_page(cat=python_cat,
title="Official Python Tutorial",
url="http://docs.python.org/2/tutorial/")
add_page(cat=python_cat,
title="How to Think like a Computer Scientist",
url="http://www.greenteapress.com/thinkpython/")
add_page(cat=python_cat,
title="Learn Python in 10 Minutes",
url="http://www.korokithakis.net/tutorials/python/")
django_cat = add_cat("Django")
add_page(cat=django_cat,
title="Official Django Tutorial",
url="https://docs.djangoproject.com/en/1.5/intro/tutorial01/")
add_page(cat=django_cat,
title="Django Rocks",
url="http://www.djangorocks.com/")
add_page(cat=django_cat,
title="How to Tango with Django",
url="http://www.tangowithdjango.com/")
frame_cat = add_cat("Other Frameworks")
add_page(cat=frame_cat,
title="Bottle",
url="http://bottlepy.org/docs/dev/")
add_page(cat=frame_cat,
title="Flask",
url="http://flask.pocoo.org")
# Print out what we have added to the user.
for c in Category.objects.all():
for p in Page.objects.filter(category=c):
print "- {0} - {1}".format(str(c), str(p))
def add_page(cat, title, url, views=0):
p = Page.objects.get_or_create(category=cat, title=title, url=url, views=views)[0]
return p
def add_cat(name):
c = Category.objects.get_or_create(name=name)[0]
return c
# Start execution here!
if __name__ == '__main__':
print "Starting Rango population script..."
populate()
这个5。7说的是啥玩意也没看懂…运行了一下也不大对
6.8 基本流程
现在我们已经掌握处理Django模型的核心功能,是时候总结一下了.下面将分别为你呈现.
6.8.1 设置数据库
当开始新Django项目,需要先告诉Django你想使用的数据库(例如设置settings.py中的DATABASES).你也可以在admin.py文件里注册任何模型.
6.8.2 加入模型
分5步进行.
- 首先,在你的应用里的models.py文件里创建新的模型.
- 修改admin.py注册你新加的模块.
- 然后进行迁移
$ python manage.py sqlmigrate <app_name>
- 使用
$ python manage.py migrate
应用更改.这将会为你的模型在数据库里建立必要的结构. - 为你的新模型创建/修改population script.
总会有一些时候你不得不删除数据库.在这种情况下你需要运行migrate命令,然后是createsuperuser命令,为每个app执行sqlmigrate命令就可.
6.9 练习
现在已经完成这章,试着做下面的练习来巩固所学.
- 增加目录模型views和likes属性并设置为0.
- 为你的app/模型进行迁移.
- 更新 population script,把Python目录设置成浏览128次和喜欢64次,Django目录浏览64次和喜欢32次,the Other Framenwork目录浏览32次,喜欢16次.
- 查看part two of official Django tutorial .它将会巩固你所学同时学习更多关于如何定制管理界面.
- 定制管理界面 - 当观看页面模型的时候它的目录,页面名和url.
6.9.1 提示
如果你需要一些帮助的话,下面的提示会帮助你.
- 修改Category模型,增加views和likes,它们的字段为IntegerFields.
- 修改populate.py脚本里的add_cat函数,加入views和likes参数.一旦你可以获取目录c,你就可以通过c.views来修改浏览次数,likes也一样.
- 为了定制管理界面,你需要修改rango/admin.py文件,创建PageAdmin类,这个类继承自admin.ModelAdmin.
- 在PageAdmin类里,加入list_display = (‘title’, ‘category’, ‘url’).
- 最后注册PageAdmin类到Django管理界面.需要修改admin.site.register(Page).在Rango的admin.py文件里修改成admin.site.register(Page,PageAdmin).