2 第一个Django应用 第1部分(数据库与模型)
目标应用:
- 一个公开的网站,可以让访客查看投票的结果并让他们进行投票。
- 一个后台管理网站,你可以添加、修改和删除选票。
查看django版本
python -c "import django; print(django.get_version())"
2.1创建一个项目
django-admin startproject mysite
mange.py:命令行工具
mysite/:项目的真正python包,导入时需要使用python包名字,如mysite.urls
mysite/setting.py:Django项目的配置
mysite/urls.py:Django站点的目录
mysite/wsgi.py:用于项目的WSGI兼容的Web服务器入口
2.2数据库的建立
默认数据库使用SQLite,在setting.py文件的DATABASES‘default’中,可以修改数据库设置。ENGINE为支持的数据库,NAME为数据库名称,默认为os.path.join(BASE_DIR, 'db.sqlite3')
python manage.py migrate 根据数据库设置自动创建数据库表
python manage.py runserver 启动Django开发服务器,默认端口8000
python manage.py runserver 8080 使用8080端口
python manage.py runserver 0.0.0.0:8000 其他电脑上展示
2.3创建模型
项目:项目是一个特定网站中相关配置和应用的集合。
应用:应用是一个Web应用程序,它完成具体的事项——比如一个博客系统、一个存储公共档案的数据库或者一个简单的投票应用。可以运用于多个项目。
开发环境建立后,使用python manage.py startapp polls创建应用。
结构如下polls/
__init__.py
admin.py
migrations/
__init__.py
models.py
tests.py
views.py
当编写一个数据库驱动的Web应用时,第一步就是定义该应用的模型 —— 本质上,就是定义该模型所对应的数据库设计及其附带的元数据。
这个简单的投票应用中,我们将创建两个模型: Question和Choice。
polls/models.py
from django.db import models
#通过Field类的实例表示字段,告诉Django,每个字段中保存着什么类型的数据。
class Question(models.Model):
question_text = models.CharField(max_length=200)#字符字段
pub_date = models.DateTimeField('date published')#日期字段 class Choice(models.Model):
question = models.ForeignKey(Question) #ForeignKey定义了一个关联。它告诉Django每个Choice都只关联一个Question
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
2.4激活模型
第一步.告诉项目polls应用安装
再次编辑mysite/settings.py文件,并修改INSTALLED_APPS设置以包含字符串'polls'。所以它现在是这样的:
mysite/settings.py
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls',
)
第二步.为应用创建数据库表
python manage.py makemigrations polls为这些修改创建迁移文件
python manage.py migrate将这些改变更新到数据库中。
2.5玩转API
先修改models.py,添加__str__()方法给Question和Choice,不仅会使你自己在使用交互式命令行时看得更加方便,而且会在Django自动生成的管理界面中使用对象的这种表示。
polls/models.py
from django.db import models class Question(models.Model):
# ...
def __str__(self): r
return self.question_text class Choice(models.Model):
# ...
def __str__(self):
return self.choice_text
python manage.py shell
进入python环境,;路径为mysite/setting.py文件的路径
>>> from polls.models import Question, Choice
# 导入刚写的模型
# 查看所有对象
>>> Question.objects.all()
[]
#使用timezone代替datetime.now()防止出错 >>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now()) #保存对象
>>> q.save()
>>> q.id
1
#查看属性
>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>) # 改变属性
>>> q.question_text = "What's up?"
>>> q.save() # 查看所有对象
>>> Question.objects.all()
[<Question: Question object>]
添加一个自定义方法
polls/models.py
import datetime from django.db import models
from django.utils import timezone class Question(models.Model):
# ...
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
保存这些改动,然后通过python manage.py shell再次打开一个新的Python 交互式shell:
>>> from polls.models import Question, Choice >>> Question.objects.all()
[<Question: What's up?>] # Django提供了一个丰富的数据库查找API,通过关键字查找。
>>> Question.objects.filter(id=1)
[<Question: What's up?>]
>>> Question.objects.filter(question_text__startswith='What')
[<Question: What's up?>] # 获取与今年年份相等的对象
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: What's up?> # 如果ID不存在,报错
>>> Question.objects.get(id=2)
Traceback (most recent call last):
...
DoesNotExist: Question matching query does not exist. # 由主键查找是最常见的情况,因此Django提供了一种对主键精确查找的快捷方式。下面的内容与问题.objects.get(id=1)相同。
>>> Question.objects.get(pk=1)
<Question: What's up?> # 查看定义的方法是否可用
>>> q = Question.objects.get(pk=1)
>>> q.was_published_recently()
True # 显示所有相关对象集
>>> q.choice_set.all()
[] # 用create创建新对象.
>>> q.choice_set.create(choice_text='Not much', votes=0)
<Choice: Not much>
>>> q.choice_set.create(choice_text='The sky', votes=0)
<Choice: The sky>
>>> c = q.choice_set.create(choice_text='Just hacking again', votes=0) # 通过API访问关联的对象
>>> c.question
<Question: What's up?> # 反之也成立
>>> q.choice_set.all()
[<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]
>>> q.choice_set.count()
3 # 选择查看对象
>>> Choice.objects.filter(question__pub_date__year=current_year)
[<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>] # 删除对象
>>> c = q.choice_set.filter(choice_text__startswith='Just hacking')
>>> c.delete()
2 第一个Django应用 第1部分(数据库与模型)的更多相关文章
- Django教程:[33]从数据库生成模型
在使用django做网站的时候,有时候我们的数据库来自一个已有的数据库,如何整合这个数据库呢? django提供了方便的方法来整合已有数据库,下面我们看看具体的方法: 1.先来设置数据库:在网站文件夹 ...
- django “如何”系列8:如何为模型提供初始化数据
当你第一次配置一个app的时候,有时候使用硬编码的数据去预填充你的数据库是非常有用的.这里有几个你可以让django自动创建这些数据的方法:你可以提供固定格式的初始化数据或者提供通过SQL初始化数据. ...
- 第一个django
4.创建第一个Django工程 Django环境算是配置完成了,你可以到命令提示符下创建第一个Django应用,进入某个目录,执行django-admin.py startproject myproj ...
- 搭建你的第一个Django应用程序
首先你要确保你机器上面安装了python:Python开发_python的安装 python的相关学习资料:http://www.cnblogs.com/hongten/tag/python/ 其次, ...
- Python开发入门与实战2-第一个Django项目
2.第一个Django项目 上一章节我们完成了python,django和数据库等运行环境的安装,现在我们来创建第一个django project吧,迈出使用django开发应用的第一步. 2.1.创 ...
- 编写你的第一个 Django 程序 第1部分
原地址:http://django-chinese-docs.readthedocs.org/en/latest/intro/tutorial01.html 让我们通过例子来学习. 在本教程中,我们将 ...
- Django教程:第一个Django应用程序(4)
Django教程:第一个Django应用程序(4) 2013-10-09 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 37391319 #博客: ...
- Django教程:第一个Django应用程序(3)
Django教程:第一个Django应用程序(3) 2013-10-08 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 37391319 #博客: ...
- 第一个Django项目及部署到Sina App Engine
Sina App Engine简称SAE,是个比较好的网站托管平台,目前说是全面免费,其实就是每个人分配很小的资源配额,在一定的使用范围内不用消耗云豆(SAE计费方式),对于个人学习和研究足够了,同类 ...
- 如何创建一个Django项目
Django 软件框架 软件框架是由其中的各个模块组成,每个模块负责特定的功能,模块与模块之间相互协作来完成软件开发. MVC简介 MVC框架的核心思想是:解耦,让不同的代码块之间降低耦合,增强代码的 ...
随机推荐
- JAVA 多线程之volatile的介绍
volatile的介绍 volatile的主要作用是:提示编译器该对象的值有可能在编译器未监测的情况下被改变. volatile类似于大家所熟知的const也是一个类型修饰符.volatile是给编译 ...
- android layout文件优化
性能优化1--UI优化 1.使用系统为我们提供了几个抽象的标签①include:重用include中layout属性指定一个外部布局文件,通过该方式则不需要把这个布局文件在该代码中重复的写一遍了. 若 ...
- vim 命令学习(高级篇)
[1]打开文件方式 (1)vim +n filename 作用:打开文件,并定位到第n行 例如:vim +103 2019-02-26-errorrepeat.txt 效果:打开2019-02-26- ...
- 牛客网 完数VS盈数
题目链接:https://www.nowcoder.com/practice/ccc3d1e78014486fb7eed3c50e05c99d?tpId=40&tqId=21351&t ...
- Electron: 从零开始写一个记事本app
Electron介绍 简单来说,Electron就是可以让你用Javascript.HTML.CSS来编写运行于Windows.macOS.Linux系统之上的桌面应用的库.本文的目的是通过使用Ele ...
- js 星星效果思路
//星星的效果思路 1.获取需要修改的元素 ul li 跟p 布局 2.给li 加移入事件 更改提示框显示, 3.给li 加移出事件 更改提示框隐藏 4.给li加索引值代表自己的序号 5.在li移入时 ...
- 剑指offer(45)扑克牌顺子
题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决 ...
- asp.net 后台 get,post请求
//Post请求 public static string Post(string url,string obj=null) { string param = (obj);//参数 byte[] bs ...
- svg(一)
<svg width="100%" height="100%" version="1.1" xmlns="http://ww ...
- 力扣(LeetCode)561. 数组拆分 I
给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大. 示例 ...