django学习(2)---书写第一个应用(app)第一部分

原文http://docs.djangoproject.com/en/1.2/intro/tutorial01/#intro-tutorial01

1.使用django-admin.py startproject project创建一个project

   django-admin.py startproject mysite.在当前目录下创建了一个mysite目录

   mysite目录包含下面四个文件

   1>__init__.py:这是一个空文件,用来表示当前目录是一个包

   2>manage.py:这是一个可以让你与Django project通过各种方式进行交互的命令行实用程序。后面我们会详细讲解

   3>settings.py:用于设置django project。设置内容包括数据库连接,project所包含的app等等

   4>urls.py。django project的url声明。

2。manag.py runserver ip port

    manage.py runserver 80 #启动django server,会看到下面的界面

    django学习(2)---书写第一个应用(app)第一部分_第1张图片

    在地址栏输入:http://127.0.0.1,出现下面的结果说明配置成功。

    django学习(2)---书写第一个应用(app)第一部分_第2张图片

3。配置数据库

    打开settings.py,修改 DATABASES类似如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # 4。这里我们使用MySQL数据库。.
        'NAME': 'django',                      #数据库名称,如果使用SQLite3,指明其路径.
        'USER': 'root',                      # 连接数据库的用户名,SQLite3可以不用.
        'PASSWORD': '123456',                  # 连接数据库的密码,SQLite3不用.
        'HOST': '',                      # 数据库所在的服务器。我们这里与project在同一目录,可以不指定.
        'PORT': '',                      # 数据库端口号.
    }
}

     然后manage.py syncdb. 注意:上例中的数据库必须首先创建。

     通过manage.py syncdb命令可以将你创建的app同步到数据库。

4。通过manage.py startapp appname创建app.

    manage.py startapp polls# 会在当前目录下创建polls目录。polls目录下同样也包含四个文件

    __init__.py,models.py,tests.py,views.py

    编辑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=models.CharField(max_length=200)
    votes=models.IntegerField()

修改settings.py的INSTALLED_APPS部分,成为如下内容:

 

  
  
INSTALLED_APPS = (
' django.contrib.auth ' ,
' django.contrib.contenttypes ' ,
' django.contrib.sessions ' ,
' django.contrib.sites ' ,
' django.contrib.messages ' ,
' mysite.polls ' ,
)

   运行manage.py validate检验是否有错误。如果出现"0 errors found".说明没有问题。

   通过manage.py sql polls.可以查看同步到数据库时,将要执行的sql语句是什么.下图是sql语句

   django学习(2)---书写第一个应用(app)第一部分_第3张图片

   说明:1>这里的sql语句可能会因所用数据库的不同,sql语句会有所不同。

          2>表名的确定。表名有appname_lower(model)组成。如例子中的appname为polls,model有poll和choice,所以表名

       为polls_choice,polls_poll.

          3>sql命令并没有真正的在数据库中执行,它只是输出django将要执行的sql语句。

          4>通过上面的sql语句,我们看到django自动给每个表新增了逐渐字段id.

          5>外键使用了modelname_id.如polls_choice表中的poll_id字段。

   另:这里相关的命令还有:manage.py sqlcustom appname,manage.py sqlclear appname(根据数据库中表的存在情况,输出drop table所需的语句),manage.py sqlindexes appname(输出app的创建索引的sql语句),manage.py sqlall appname(是对sql,sqlcustom,sqlindexes的一个组合).

     manage.py syncdb 同步到数据库

  

5.用API做一些尝试

  运行manage.py shell. 注意这里不是python shell.我们首先来看一下manage.py shell做的设置。

 

代码
   
   
>>> import sys
>>> sys.path
[
' D:\\mysite ' , ' C:\\Python25\\lib\\site-packages\\babel-0.9.5-py2.5.egg ' , ' C:\\P
ython25\\lib\\site - packages\\trac - 0.11 . 7 .1dev - py2. 5 .egg ' , 。。。。]
>>> import os
>>> os.environ[ " DJANGO_SETTINGS_MODULE " ]
' mysite.settings '

  manage.py shell做了两项工作:

  1>将mysite添加到了sys.path里面

  2>设置了环境变量DJANGO_SETTINGS_MODULE,环境变量指明了settings 的路径

 

代码
>>> from mysite.polls.models import Poll,Choice
>>> # no polls are in the system yet
>>> Poll.objects.all()
>>> import datetime
>>> p=Poll(question="What's up?",pub_date=datetime.datetime.now())
>>> p.save()#保存对象到数据库,需要调用save()方法
>>> p.id
1L
>>> p.question #访问数据库列
"What's up?"
>>> p.pub_date #
datetime.datetime(
2010, 8, 10, 10, 44, 56, 593000)
>>> p.pub_date=datetime.datetime(2010,8,10,0,0)
>>> p.save()
>>> p.pub_date
datetime.datetime(
2010, 8, 10, 0, 0)
>>> Poll.objects.all()
[
<Poll: Poll object>]

看到下面这里有点奇怪,

 

  
  
>>> Poll.objects.all()
[
< Poll: Poll object > ]

我们修改一下,编辑polls/models.py,修改成如下内容:

 

代码
   
   
# coding:cp936

from django.db import models


class Poll(models.Model):
question
= models.CharField(max_length = 200 )
pub_date
= models.DateTimeField( " date published " )
#新增__unicode__(self)方法
def __unicode__ (self):
return self.question

class Choice(models.Model):
poll
= models.ForeignKey(Poll)
choice
= models.CharField(max_length = 200 )
votes
= models.IntegerField()
#新增__unicode__(self)方法
def __unicode__ (self):
return self.choice

看效果:

  
  
>>> from mysite.polls.models import Poll
>>> Poll.objects.all()
[
< Poll: What ' s up?>]

下面再给Poll添加自定义的方法,was_published_today.

代码
   
   
from django.db import models
import datetime

class Poll(models.Model):
question
= models.CharField(max_length = 200 )
pub_date
= models.DateTimeField( " date published " )

def __unicode__ (self):
return self.question
# 新增was_published_today方法
def was_published_today(self):
return self.pub_date.date() == datetime.datetime.today()

再次运行manage.py shell

 

代码
   
   
>>> from mysite.polls.models import Poll,Choice
>>> Poll.objects.all() # 获取所有
[ < Poll: What ' s up?>]
>>> Poll.objects.filter(id = 1 ) # 查找方法,
[ < Poll: What ' s up?>]
>>> Poll.objects.filter(question__startswith = " What " ) # 查找方法,
[ < Poll: What ' s up?>]
>>> Poll.objects.get(pub_date__year = 2010 ) # 查找方法,
< Poll: What ' s up?>
>>> Poll.ojbects.get(id = 2 ) # 查找方法,这里id =2的Poll不存在
Traceback (most recent call last):
File
" <console> " , line 1 , in < module >
AttributeError: type object
' Poll ' has no attribute ' ojbects '
>>> Poll.objects.get(id = 2 )
Traceback (most recent call last):
File
" <console> " , line 1 , in < module >
File
" C:\Python25\Lib\site-packages\django\db\models\manager.py " , line 132 , in
get
return self.get_query_set().get( * args, ** kwargs)
File
" C:\Python25\Lib\site-packages\django\db\models\query.py " , line 341 , in g
et
% self.model._meta.object_name)
DoesNotExist: Poll matching query does
not exist.
>>> Poll.objects.get(pk = 1 )
< Poll: What ' s up?>
>>> p = Poll.objects.get(pk = 1 )
>>> p.was_published_today() # 调用我们自定义的方法was_published_today
False

下面我们来看一下关系

代码
   
   
>>> p.choice_set.all() # 查看该p对应的所有choice
[]
>>> p.choice_set.create(choice = " Not much " ,votes = 0) # 创建对应的choice
< Choice: Not much >
>>> p.choice_set.create(choice = " The sky " ,votes = 0)
< Choice: The sky >
>>> c = p.choice_set.create(choice = " Just hacking again " ,votes = 0)
>>> c.poll
< Poll: What ' s up?>
>>> p.choice_set.all()
[
< Choice: Not much > , < Choice: The sky > , < Choice: Just hacking again > ]
>>> p.choice_set.count() # 统计p的choice数目
3
>>> type(p.choice_set)
< class ' django.db.models.fields.related.RelatedManager ' >
>>> Choice.objects.filter(poll__pub_date__year = 2010 )
[
< Choice: Not much > , < Choice: The sky > , < Choice: Just hacking again > ]
>>> c = p.choice_set.filter(choice__startswith = " Just hacking " )
>>> c
[
< Choice: Just hacking again > ]
>>> c.delete() # 删除

 

你可能感兴趣的:(django)