django学習(2)---最初のアプリケーション(app)の第1部を書く

37536 ワード

原文http://docs.djangoproject.com/en/1.2/intro/tutorial01/#intro-tutorial01
1.django-admin.py startprojectを使用してプロジェクトを作成する
   django-admin.py startproject mysite.現在のディレクトリの下にmysiteディレクトリが作成されました
   mysiteディレクトリには次の4つのファイルが含まれています.
   1>__init__.py:現在のディレクトリがパッケージであることを示す空のファイルです.
   2>manage.py:Django projectと様々な方法で対話できるコマンドラインユーティリティです.後で詳しく説明します
   3>settings.py:djangoプロジェクトを設定します.設定内容には、データベース接続、プロジェクトに含まれるappなどが含まれます.
   4>urls.py.djangoプロジェクトの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',                      #SQLite 3を使用する場合のデータベース名のパスを示します.
        'USER': 'root',                      # データベースに接続するユーザー名はSQLite 3では使用できません.
        'PASSWORD': '123456',                  # データベースに接続するパスワードはSQLite 3では使いません.
        'HOST': '',                      # データベースが存在するサーバです.ここではprojectと同じディレクトリにあります.指定しなくてもいいです.
        'PORT': '',                      # データベースのポート番号
    }
}
     次にmanage.py syncdb.上の例のデータベースを最初に作成する必要があります.
     作成したappをmanage.py syncdbコマンドでデータベースに同期できます.
4.manage.py startappnameでappを作成する.
    manage.py startapp polls#は、現在のディレクトリの下にpollsディレクトリを作成します.pollsディレクトリの下にも4つのファイルが含まれています.
    __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>外部キーには、polls_choiceテーブルのpoll_idフィールドなどのmodelname_idが使用されます.
   また、ここで関連するコマンドには、manage.py sqlcustomappname、manage.py sqlclear appname(データベース内のテーブルの存在に応じてdrop tableを出力するために必要な文)、manage.py sqlindexes appname(appのインデックス作成を出力するsql文)、manage.py sqlall appname(sql、sqlcustoms、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は2つの仕事をしました.
  1>sys.pathにmysiteを追加
  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() #