-
django实例:创建你的第一个应用投票体系(2)数据库的安装
添加时间:2013-5-30 点击量:
在上一篇中 django实例:创建你的第一个应用投票体系(一) 已经介绍根蒂根基的功能,并已经启动办事了。这一节介绍数据库相干的东东。首页打开mysite/settings.py设备文件,
设置数据库
打到DATABASESENGINE:这个是所要应用的数据库类型,如 postgresql、sqlite、mysql等。如下设置:
django.db.backends.mysql
NAME:数据库的名称或者若是你应用的是sqlite的话就是sqlite的路径。
USER :数据库的用户名
PASSWORD :数据库暗码
HOST:数据库地址
设置应用APP
找到INSTALLED_APPS
在这里你看到的这些是django默认的应用django.contrib.auth – 用户认证应用
django.contrib.contenttypes – 内容类型应用
django.contrib.sessions – session经管应用
django.contrib.sites – 经管多个站点的应用
django.contrib.messages – 消息处理惩罚
django.contrib.staticfiles – 静态文件应用下面再介绍一个号令:syncdb
这个号令会按照安装的app应用生成响应的数据库表布局、索引等信息。履行体式格式如下:python manage.py syncdb
履行完后 会看到在你设置的数据库中多了几张表,这些表就是django默认安装的应用所生成的表。
创建投票体系模型
下面先创建投票模型python manage.py startapp polls
生成的目次布局如下:
polls/
__init__.py
models.py
tests.py
views.py打开polls/models.py 文件,在里面写数据表信息。
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)里面包含两个class,每个class 都是从django的models.Model持续的。class里面的CharField、DateTimeField等用来创建响应的字段类型。
如question = models.CharField(max_length=200) 这个就代码创建字符类型的字段,最大长度为200
当然CharField、DateTimeField等都是从models.Field持续而来的。若是你想实现本身的数据类型列,也可以从models.Field持续,实现你特定的功能。
第一个为投票项,设置了两个字段
question:输入题目的字段,
pub_date:公布时候字段。
第二个为选项,包含三个字段
poll:设置选项所对应的投票项
choice_text:选项文本
votes:投票数
如今把我们添加的这个应用添加到 setting.py设备文件中INSTALLED_APPS = (
django.contrib.auth,
django.contrib.contenttypes,
django.contrib.sessions,
django.contrib.sites,
django.contrib.messages,
django.contrib.staticfiles,
# Uncomment the next line to enable the admin:
# django.contrib.admin,
# Uncomment the next line to enable admin documentation:
# django.contrib.admindocs,
polls,
)接着履行如下号令:
python manage.py sql polls
你会看到在cmd号令窗口中会呈现创建表的sql语句。履行这个号令仅仅是显示下 django内部按照模型会如何一步步的来主动创建响应的表的。
BEGIN;
CREATE TABLE polls_poll (
id serial NOT NULL PRIMARY KEY,
question varchar(200) NOT NULL,
pub_date timestamp with time zone NOT NULL
);
CREATE TABLE polls_choice (
id serial NOT NULL PRIMARY KEY,
poll_id integer NOT NULL REFERENCES polls_poll (id) DEFERRABLE INITIALLY DEFERRED,
choice_text varchar(200) NOT NULL,
votes integer NOT NULL
);
COMMIT;当然还有几个有关模型的sql号令
python manage.py validate – Checks for any errors in the construction of your models.
python manage.py sqlcustom polls – Outputs any custom SQL statements (such as table modifications or constraints) that are defined for the application.
python manage.py sqlclear polls – Outputs the necessary DROP TABLE statements for this app, according to which tables already exist in your database (if any).
python manage.py sqlindexes polls – Outputs the CREATE INDEX statements for this app.
python manage.py sqlall polls – A combination of all the SQL the sql, sqlcustom, and sqlindexes commands.如今我们再履行syncdb,这个时辰就会在数据库中看到poll表和choice表了。
python manage.py syncdb
如今打开shell,在里面进行一些简单的常用的增、删、改、查。
python manage.py shell
>>> polls.models import Poll, Choice # Import the model classes we just wrote.
# 获取Poll里面的数据,当然如今是没有的,所认为空
>>> Poll.objects.all()
[]
# 添加一个投票,在这个引入了django里面的关于时候的一个模块。
>>> django.utils import timezone
>>> p = Poll(question=Whats new?, pub_date=timezone.now())
# 保存
>>> p.save()
# 看看保存之后生成的id及question和pub_date
>>> p.id
1
>>> p.question
Whats new?
>>> p.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
# 批改question,记得要保存
>>> p.question = Whats up?
>>> p.save()
# 再查看一个
>>> Poll.objects.all()
[<Poll: Poll object>]在这个我们看到,输出的是<oll: Poll object>这个对象,我们相要的是直接的数据,所以在每个class里面给加上__unicode__() ,来输出响应的内容,其实就相当于c#、java里面的ToString()给重载下。
class Poll(models.Model):
# ...
def __unicode__(self):
return self.question
class Choice(models.Model):
# ...
def __unicode__(self):
return self.choice_text你可以看看__unicode__() 和 __str__()的差别
我们给Poll class增长一个新的办法import datetime
django.utils import timezone
# ...
class Poll(models.Model):
# ...
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)下面我们再操纵一下。
>>> polls.models import Poll, Choice
# Make sure our __unicode__() addition worked.
>>> Poll.objects.all()
[<Poll: Whats up?>]
#
>>> Poll.objects.filter(id=1)
[<Poll: Whats up?>]
>>> Poll.objects.filter(question__startswith=What)
[<Poll: Whats up?>]
# 按照公布时候来查找数据
>>> django.utils import timezone
>>> current_year = timezone.now().year
>>> Poll.objects.get(pub_date__year=current_year)
<Poll: Whats up?>
# Request an ID that doesnt exist, this will raise an exception.
>>> Poll.objects.get(id=2)
Traceback (most recent call last):
...
DoesNotExist: Poll matching query does not exist. Lookup parameters were {id: 2}
>>> Poll.objects.get(pk=1)
<Poll: Whats up?>
# 调用我们刚才添加的办法
>>> p = Poll.objects.get(pk=1)
>>> p.was_published_recently()
True
# 按照主键来查找数据
>>> p = Poll.objects.get(pk=1)
>>> p.choice_set.all()
[]
# 创建三个选项
>>> 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)
# 接见投票项
>>> c.poll
<Poll: Whats up?>
# 由poll对象来接见 它接洽关系的选项的所以的凑集
>>> p.choice_set.all()
[<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]
>>> p.choice_set.count()
3
# 查询投票项公布时候是本年的选项
>>> Choice.objects.filter(poll__pub_date__year=current_year)
[<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]
# 查找当前投票中以Just hacking为开首的选项,并删除
>>> c = p.choice_set.filter(choice_text__startswith=Just hacking)
>>> c.()对数据库的接见根蒂根基就这些了
彼此相爱,却不要让爱成了束缚:不如让它成为涌动的大海,两岸乃是你们的灵魂。互斟满杯,却不要同饮一杯。相赠面包,却不要共食一个。一起歌舞欢喜,却依然各自独立,相互交心,却不是让对方收藏。因为唯有生命之手,方能收容你们的心。站在一起却不要过于靠近。—— 纪伯伦《先知》