基于How To Tango With Django 1.7的实践(5)——Models and Databases

通常来说处理数据库需要我们掌握许多复杂的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步进行.

  1. 首先,在你的应用里的models.py文件里创建新的模型.
  2. 修改admin.py注册你新加的模块.
  3. 然后进行迁移$ python manage.py sqlmigrate <app_name>
  4. 使用$ python manage.py migrate应用更改.这将会为你的模型在数据库里建立必要的结构.
  5. 为你的新模型创建/修改population script.

总会有一些时候你不得不删除数据库.在这种情况下你需要运行migrate命令,然后是createsuperuser命令,为每个app执行sqlmigrate命令就可.

6.9 练习

现在已经完成这章,试着做下面的练习来巩固所学.

  1. 增加目录模型views和likes属性并设置为0.
  2. 为你的app/模型进行迁移.
  3. 更新 population script,把Python目录设置成浏览128次和喜欢64次,Django目录浏览64次和喜欢32次,the Other Framenwork目录浏览32次,喜欢16次.
  4. 查看part two of official Django tutorial .它将会巩固你所学同时学习更多关于如何定制管理界面.
  5. 定制管理界面 - 当观看页面模型的时候它的目录,页面名和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).
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值