} } }

    django实例:创建你的第一个应用投票体系(2)数据库的安装

    添加时间:2013-5-30 点击量:


    在上一篇中 django实例:创建你的第一个应用投票体系(一) 已经介绍根蒂根基的功能,并已经启动办事了。这一节介绍数据库相干的东东。


    首页打开mysite/settings.py设备文件,


    设置数据库
    打到DATABASES


    ENGINE:这个是所要应用的数据库类型,如 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_pollid) 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.()


    对数据库的接见根蒂根基就这些了

    彼此相爱,却不要让爱成了束缚:不如让它成为涌动的大海,两岸乃是你们的灵魂。互斟满杯,却不要同饮一杯。相赠面包,却不要共食一个。一起歌舞欢喜,却依然各自独立,相互交心,却不是让对方收藏。因为唯有生命之手,方能收容你们的心。站在一起却不要过于靠近。—— 纪伯伦《先知》
    分享到: