Django学习笔记(二)App创建之Model
通过实例学习, 构建一个投票(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的更多相关文章
- Django学习笔记(三)—— 型号 model
疯狂暑期学习 Django学习笔记(三)-- 型号 model 參考:<The Django Book> 第5章 1.setting.py 配置 DATABASES = { 'defaul ...
- Django学习笔记二
Django学习笔记二 模型类,字段,选项,查询,关联,聚合函数,管理器, 一 字段属性和选项 1.1 模型类属性命名限制 1)不能是python的保留关键字. 2)不允许使用连续的下划线,这是由dj ...
- InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移
系列目录 InterSystems Ensemble学习笔记(一) Ensemble介绍及安装InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移 一 ...
- django学习笔记二:一个项目多个App项目搭建
django充许在一个项目中存在多个app,如一个大门户网站中可以包含论坛,新闻等内容,其中每一个模块称之为一个App,也可以理解为一个个独立的小型项目最终集成在一个门户网站中最终呈现给用户 本次测试 ...
- MongoDB学习笔记二:创建、更新及删除文档
插入并保存文档 对目标集使用insert方法插入一个文档: > db.foo.insert({"bar" : "baz"}) 这个操作会给文档增加一个&q ...
- ROS学习笔记二(创建ROS软件包)
catkin软件包的组成 一个软件包必须满足如下条件才能被称之为catkin软件包: 必须包含一个catkin编译文件package.xml(manifests文件),此文件包含了描述该软件包的重要信 ...
- 【传智播客】Libevent学习笔记(二):创建event_base
目录 00. 目录 01. 简介 02. 创建默认的event_base 03. 创建复杂的event_base 3.1 event_config_new函数 3.2 event_base_new_w ...
- twisted 学习笔记二:创建一个简单TCP客户端
#coding=utf-8 from twisted.internet import reactor,protocol class QuickClient(protocol.Protocol): de ...
- Django 学习笔记(二)
Django 第一个 Hello World 项目 经过上一篇的安装,我们已经拥有了Django 框架 1.选择项目默认存放的地址 默认地址是C:\Users\Lee,也就是进入cmd控制台的地址,创 ...
- Django学习笔记(二):使用Template让HTML、CSS参与网页建立
Django学习笔记(二):使用Template让HTML.CSS参与网页建立 通过本文章实现: 了解Django中Template的使用 让HTML.CSS等参与网页建立 利用静态文件应用网页样式 ...
随机推荐
- 阿里重磅开源在线分析诊断工具Arthas(阿尔萨斯)
github地址: Arthas English version goes here. Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,Art ...
- 按钮显示隐藏div、input等
<script type="text/javascript"> function show() { var value = document.getElementByI ...
- osg include lib -computer1
E:\\OpenSceneGraph\\OpenSceneGraph_3_6_install\\lib E:\\OpenSceneGraph\\3rdParty\\v140-x64\\lib Open ...
- 算法习题---5-2Ducci序列(UVa1594)
一:题目 对于一个n元组(a1, a2, …, an),可以对于每个数求出它和下一个数的差的绝对值,得到一个新的n元组(|a1-a2|, |a2-a3|, …, |an-a1|).重复这个过程,得到的 ...
- C++笔试
个人整理,借鉴网络 1.C和C++中struct的区别 1).C的struct无protect和private属性,C++的有 2).C不能定义函数,C++能 3).C中struct加了typedef ...
- LeetCode_350. Intersection of Two Arrays II
350. Intersection of Two Arrays II Easy Given two arrays, write a function to compute their intersec ...
- 【超分辨率】—图像超分辨率(Super-Resolution)技术研究
一.相关概念 1.分辨率 图像分辨率指图像中存储的信息量,是每英寸图像内有多少个像素点,分辨率的单位为PPI(Pixels Per Inch),通常叫做像素每英寸.一般情况下,图像分辨率越高,图像中包 ...
- 【转】do...while(0)的妙用
前言 今天无意中看到这个标题,因为好奇就点进去了,不错,又学习啦... 具体内容: 1. do...while(0)消除goto语句: 2 宏定义中的do...while(0): 参考 1. 原链接_ ...
- NB-IOT技术 UP模式 和CP模式,用户面和控制面,数据面
先看下面的图 UE就是NB-IOT设备,那么UE的数据到应用服务器有3条路可以走 第一条,UE,基站,MME,SCEF,应用服务器,这个是CP模式,也叫控制面,也叫信令无线承载面,也叫控制面承载,叫法 ...
- Red Team远程控制软件
开源远程管理控制 https://github.com/malwaredllc/byob 僵尸网络生成框架 https://github.com/panda-re/lava 大规模向程序中植入恶意程序 ...