通过实例学习, 构建一个投票(Polls)Application, 目标结果包含两个site, 一个site用来显示投票问题以及投票结果(即将展示出来的网站), 另一个site用来管理Poll实例的增删改查(即后台内容管理CMS).

1.   创建工程

django-admin.py startproject mysite

在当前目录下, 会创建一个mysite的工程目录. 那么我们的代码放在哪里比较好呢? 可能会放到OS自带的server根目录(document root)下, 比如/var/www, 这样我们可以直接通过浏览器访问到代码. 不过这样代码的安全性不是很好,所以建议放到server根目录以外的目录下.

工程结构:

   mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py 外层的mysite目录, 是工程的整个容器, 对django是没什么意义的, 所以随便改什么名字都可以.
manage.py是一个命令行工具, 来管理整个工程, --help来查看相应的命令.
内层的mysite目录, 是工程的一个包, 同时也是工程的入口, 我们需要通过这个包名来引用我们需要的各种配置和变量.
mysite/__init__.py: 说明当前这个目录mysite/是一个python包.
mysite/settings.py: 工程的配置文件
mysite/urls.py:工程的路由调度
mysite/wsgi.py:wsgi服务器的入口点(How to deploy with WSGI)

2.   内部开发服务器

python manage.py runserver

进入工程目录下,执行以上命令,django内部自带开发服务器(一个纯粹由python写的轻量级服务器)将会启动. 浏览器中访问localhost:8000,

我们会看到一个“Welcome to Django”, it worked.

注:改变监听端口命令:python manage.py runserver 8080      改变监听所有公共IPs: python manage.py runserver 0.0.0.0:8000

3.   数据库设置

更改DATABASES ’default’选项

Engine - django.db.backends.*, oracle、mysql或者sqlite3等, 其他的后端比如(south.db.) sql_server.pyodbc
NAME – 数据库名称,如果使用sqlite3,此处应该是文件的绝对路径(e.g.C:/homes/user/mysite/sqlite3.db).请注意此处用斜杠,而不是反斜杠.
USER – 数据库用户名(sqlite不需要)
PASSWORD – 数据库密码(sqlite不需要)
HOST – 数据库主机地址 “127.0.0.1” or "**.**.com"
PORT - 主机开放端口 一般为3306 如果使用mysql或者PostgreSQL,首先必须在数据库服务器端口,执行创建数据库命令,确保设置中的数据库是存在的,而sqlite不需要,同步数据时会默认创建.

python manage.py syncdb(即将删除,用migrate替代)

django会自动同步 INSTALLED_APPS 下的所有Apps到数据库中,表现形式为各个App创建相应的数据表,与此同时,第一次执行会创建一个用于管理数据表的超级管理员 super administrator.

4.   Model创建

项目中所有用到的Apps其实都是由python的包组成的.

  Project和 App的区别:

  App是一个旨在专门完成某项工作的Web应用, 比如Blog、Session记录等, 而Project是配置文件和一系列Apps集合所组成的. 一个工程中可以有多个App, 一个App可以存在多个Project中(即可复用性). 一个App可以放在任意地方, 只需要添加到Python path中, 让工程可以找到.

python manage.py startapp polls

执行后会在工程根目录下创建一个polls目录, 包含__init__.py view.py models.py etc. 如果想把某个App包含在单独的目录下, 比如/mysite/apps, 进入到apps目录后, python ../manage.py startapp polls, 不过以后引用要从apps开始导入, from apps.polls.models import Poll, Choice.

下面在polls\models.py中输入如下代码:

from django.db import models

class Poll(models.Model):
question = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published') class Choice(models.Model):
poll = models.ForeignKey(Poll)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)

代码清晰明了, 两个类均继承于django.db.models.Model, 变量都是Filed实例, 两个类的关系由models.ForeignKey(多对一)确定, Poll是Choice的外键, 即一个Poll对应多个Choice.

将Polls配置到setting.py文件的 INSTALLED_APPS 中(不要忘记每个App配置后用逗号分隔), 然后执行python manage.py syncdb, 在数据库中创建好Polls App的数据表. python manage.py sql polls, manage.py validate等命令可以用来进一步研究django在后台运作的原理.

5.   DB API交互

python manage.py shell

运行此命令后, manage.py命令会设置 DJANGO_SETTINGS_MODUL 环境变量, 这提供了django引用python全局路径., 我们需要的资源都有了出处.

 >>> from polls.models import Poll, Choice   # Import the model classes we just wrote.
# No polls are in the system yet. >>> Poll.objects.all()
[] >>> from django.utils import timezone
>>> p = Poll(question="What's new?", pub_date=timezone.now())
# Save the object into the database. You have to call save() explicitly.
>>> p.save() >>> p.id
1 >>> Poll.objects.all()
[<Poll: Poll object>]

稍等一下, [<Poll: Poll object>]显示不清晰, 对直观的感受没什么帮助, 解决办法是: 在models.py中为不同的类添加一个__unicode__方法, 在python3中, 因为规范了字符串的统一处理, 需要用 __str__ 进行替换.

 class Poll(models.Model):
# ...
def __unicode__(self): # Python 3: def __str__(self):
return self.question class Choice(models.Model):
# ...
def __unicode__(self): # Python 3: def __str__(self):
return self.choice_text

python2.*版本没有统一unicode和Ascii编码的处理, 所以针对字符串会经常出现错误, 比如在__unicode__中return self.id, CMD中遍历输出unicode数据, 都是编解码错误的原因.

重新载入python manage.py shell,

>>> from polls.models import Poll, Choice
# 确保 __unicode__() 已工作.
>>> Poll.objects.all()
[<Poll: What's up?>] # 以下语句相当于 Poll.objects.get(id=1).
>>> Poll.objects.get(pk=1)
<Poll: What's up?>
>>> p = Poll.objects.get(pk=1) # 显示所有与p相关的choice集合 -- 目前为止为none.
>>> p.choice_set.all()
[] # 创建三个choice实例.
>>> p.choice_set.create(choice_text='Not much', votes=0)
<Choice: Not much> >>> p.choice_set.create(choice_text='The sky', votes=0)
<Choice: The sky> >>> c = p.choice_set.create(choice_text='Just hacking again', votes=0) # 可通过choice实例访问外键, 由于__unicode__, 只返回“What's up”.
>>> c.poll
<Poll: What's up?> # 取得所有P下的choice集合.
>>> p.choice_set.all()
[<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>] >>> p.choice_set.count()
3

That's it.

Django学习笔记(二)App创建之Model的更多相关文章

  1. Django学习笔记(三)—— 型号 model

    疯狂暑期学习 Django学习笔记(三)-- 型号 model 參考:<The Django Book> 第5章 1.setting.py 配置 DATABASES = { 'defaul ...

  2. Django学习笔记二

    Django学习笔记二 模型类,字段,选项,查询,关联,聚合函数,管理器, 一 字段属性和选项 1.1 模型类属性命名限制 1)不能是python的保留关键字. 2)不允许使用连续的下划线,这是由dj ...

  3. InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移

    系列目录 InterSystems Ensemble学习笔记(一) Ensemble介绍及安装InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移 一 ...

  4. django学习笔记二:一个项目多个App项目搭建

    django充许在一个项目中存在多个app,如一个大门户网站中可以包含论坛,新闻等内容,其中每一个模块称之为一个App,也可以理解为一个个独立的小型项目最终集成在一个门户网站中最终呈现给用户 本次测试 ...

  5. MongoDB学习笔记二:创建、更新及删除文档

    插入并保存文档 对目标集使用insert方法插入一个文档: > db.foo.insert({"bar" : "baz"}) 这个操作会给文档增加一个&q ...

  6. ROS学习笔记二(创建ROS软件包)

    catkin软件包的组成 一个软件包必须满足如下条件才能被称之为catkin软件包: 必须包含一个catkin编译文件package.xml(manifests文件),此文件包含了描述该软件包的重要信 ...

  7. 【传智播客】Libevent学习笔记(二):创建event_base

    目录 00. 目录 01. 简介 02. 创建默认的event_base 03. 创建复杂的event_base 3.1 event_config_new函数 3.2 event_base_new_w ...

  8. twisted 学习笔记二:创建一个简单TCP客户端

    #coding=utf-8 from twisted.internet import reactor,protocol class QuickClient(protocol.Protocol): de ...

  9. Django 学习笔记(二)

    Django 第一个 Hello World 项目 经过上一篇的安装,我们已经拥有了Django 框架 1.选择项目默认存放的地址 默认地址是C:\Users\Lee,也就是进入cmd控制台的地址,创 ...

  10. Django学习笔记(二):使用Template让HTML、CSS参与网页建立

    Django学习笔记(二):使用Template让HTML.CSS参与网页建立 通过本文章实现: 了解Django中Template的使用 让HTML.CSS等参与网页建立 利用静态文件应用网页样式 ...

随机推荐

  1. Dart介绍和环境搭建

    /* Dart介绍: Dart是由谷歌开发的计算机编程语言,它可以被用于web.服务器.移动应用 和物联网等领域的开发. Dart诞生于2011年,号称要取代JavaScript.但是过去的几年中一直 ...

  2. 【Mybatis】MyBatis之缓存(七)

    MyBatis缓存介绍 Mybatis 使用到了两种缓存:一级缓存(本地缓存.local cache)和二级缓存(second level cache). 一级缓存:基于PerpetualCache ...

  3. Qt编写气体安全管理系统10-数据导出

    一.前言 数据导出一般指导出到excel表格,可能有部分用户还需要导出到pdf,因为pdf基本上不可编辑,防止用户重新编辑导出的数据,excel可能绝大部分用过电脑的人都知道,广为流行,主要就是微软的 ...

  4. vmware安装gho系统(win10上安装虚拟机然后在vmware上安装win7)

    用ghost直接将gho转成vmdk将ghost32, gho文件放到同一目录, cmd里进入对应目录,输入以下命令ghost32 -clone,mode=restore,src=example.gh ...

  5. 在 ServiceModel 客户端配置部分中,找不到引用协定“WebServiceSoap”的默认终结点元素。这可能是因为未找到应用程序的配置文件,或者是因为客户端元素找不到与此协定匹配的终结点元素(转)

    按语: 在项目中实现自动升级过程,在类库中调用webservice取升级update.xml文件,添加服务调用,但在类库中调用时就出现异常,但在简单的测试工程中没有问题.解决方法采用下面介绍的方法 在 ...

  6. [ kvm ] 学习笔记 6:virsh 命令及功能详解

    1. 虚拟机管理操作 attach-device 从XML文件附加设备 attach-disk 附加磁盘设备 attach-interface 连接网络接口 autostart 自动启动一个域 blk ...

  7. 解决no module named setuptools

    To install setuptools on Debian: sudo apt-get install python-setuptools For Python 3.x: sudo apt-get ...

  8. 【Leetcode_easy】872. Leaf-Similar Trees

    problem 872. Leaf-Similar Trees 参考 1. Leetcode_easy_872. Leaf-Similar Trees; 完

  9. C++标准模板库Stand Template Library(STL)简介与STL string类

    参考<21天学通C++>第15和16章节,在对宏和模板学习之后,开启对C++实现的标准模板类STL进行简介,同时介绍简单的string类.虽然前面对于vector.deque.list等进 ...

  10. VMware虚拟机及Linux安装

    VMware虚拟机安装指南:http://bbs.luobotou.org/thread-5750-1-1.html Linux系统各发行版镜像下载地址:http://www.linuxidc.com ...