วันอังคารที่ 3 ธันวาคม พ.ศ. 2556

Django documentation First steps Tutorial: Part 1

Writing your first Django app, part 1
ใน Tutorial part 1 จะสอนเราเริ่มตั้งแต่สตาร์ทโปรเจค การรันเซิฟเวอร์ การเซ็ทอัพดาต้าเบส การสตาร์ทแอพ พื้นฐานการใช้คลาสกับดาต้าเบส การซิงค์ดาต้าเบสกับแอพ และสุดท้ายพื้นฐานการใช้ API บน python shell
เริ่มต้นจะเป็นการให้ใช้คำสั่ง
 python -c "import django; print(django.get_version())"  
เป็นการเช็คเวอร์ชั่น Django และเช็คว่าได้ทำการติดตั้ง Django เรียบร้อยแล้ว


Create a project
ให้ทำการสร้างโปรเจคเพื่อเป็นการเริ่มใช้ Django โดยใช้ Command
 django-admin.py startproject [NAME PROJECT]  


หลังจากสร้างโปรเจคเรียบร้อยร้อยแล้วเราจะพบว่า Django ได้สร้างไฟล์เพิ่มมาให้เรา 5 ไฟล์ สามารถใช้ command: ls -R เพื่อตรวจเช็คไฟล์ที่ได้สร้างมา
 DjangoTutorial/  
   manage.py  
   DjangoTutorial/  
     __init__.py  
     settings.py  
     urls.py  
     wsgi.py  


Run  server
ต่อไปจะเป็นการทดสอบ run server ของ project Django นี้ โดยต้องไปใน directory ที่มีไฟล์ manage.py อยู่ก่อนจากนั้นพิมพ์ Command: python manage.py runserver
 python manage.py runserver  
ถ้าไม่ติดปัญหาอะไรก็จะขึ้นตามหน้าต่างตาม terminal ด้านล่าง และสามารถเปิด browser : 127.0.0.1:8000 จะขึ้นแสดงข้อความ It's Work!! 

หน้าเวปเมื่อเข้า 127.0.0.1:8000


Database setup
ใน Django เวอร์ชั่น 1.6 นี้ดาต้าเบสปกติจะเซ็ทให้เป็น sqlite3 ซึ่งเป็นดาต้าเบสของ Django ในกรณีที่ต้องการใช้ดาต้าเบสตัวอื่นก็ให้ไปเซ็ทใน settings.py 
โดยปกติจะเซ็ทเป็น sqlit3
 DATABASES = {  
   'default': {  
     'ENGINE': 'django.db.backends.sqlite3',  
     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),  
   }  
 }  

Creating models and Activating models
การจะสร้าง models นั้นจำเป็นต้องมายัง directory ที่มีไฟล์ manage.py ก่อน เราสามารถสร้าง model ได้หลายๆ model ภายใน Django โปรเจคนี้ จากนั้นพิพม์ Command ตามด้านล่างเพื่อสร้าง model โดย Tutorial part 1 จะสร้าง APP ชื่อ Polls
 python manage.py startapp [NAME APP]  

เมื่อพิมพ์ Command เสร็จเราจะพบว่ามี Directory เป็นชื่อแอพหรือโมเดลตามที่เราตั้งชื่อภายใน Directory จะมีไฟล์ 5 ไฟล์เป็นส่วนที่ใช้ในการทำโมเดล
ไฟล์ที่ถูกสร้างขึ้นมาหลังจาก  python manage.py startapp [NAME APP] 
 polls/  
   __init__.py  
   admin.py  
   models.py  
   tests.py  
   views.py  
หลังจากนั้นให้ทำการ Activating model ด้วยการไปแก้ไข DjangoTutorial/settings.py โดยเพิ่มชื่อแอพหรือโมเดลต่อท้ายในส่วนของ INSTALLED_APPS
DjangoTutorial/settings.py 
 INSTALLED_APPS = (  
   'django.contrib.admin',  
   'django.contrib.auth',  
   'django.contrib.contenttypes',  
   'django.contrib.sessions',  
   'django.contrib.messages',  
   'django.contrib.staticfiles',  
   'polls',  
 )  

Create class for model
ทำการสร้าง class ของวัตถุโดยแก้ไขไฟล์ใน polls/models.py ซึ่งใน Tutorial Part 1 นั้นจะสร้าง class ขึ้นมาสอง class คือ Poll และ Choice ใน class Choice จะมี Foreign Key เพื่อที่เชื่อมกับ Key หลักใน class Poll
 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_text = models.CharField(max_length=200)  
   votes = models.IntegerField(default=0)  
class Poll จะมี attribute 2 ตัวคือ question ในการเก็บคำถามและ pub_date ในการเก็บวันเวลาที่สร้างคำถาม ส่วน class Choice จะมี attribute 3 ตัว 1) poll เป็น Foreign Key ที่ใช้เชื่อมกับข้อมูลใน class Poll 2) choice_text ในการเก็บตัวเลือก 3) votes เก็บจำนวนโหวต
ใช้ Command ต่อไปนีในการดูการสร้างตารางของดาต้าเบสของ model
 python manage.py sql [NAME APP]  

 ต่อไปจะเป็นการ syncdb กับ model ที่เราสร้าง พิมพ์ Command
 python manage.py syncdb 
จากรูปจะเห็นว่าเมื่อทำการซิงค์ดาต้าเบส ระบบจะทำการสร้างตารางข้อมูล สังเกตได้จากสองบรรสุดท้ายข้อคำสั่ง Create table ซึ่งเป็นการสร้างตารางข้อมูลของ class ที่เราได้ทำการสร้างไว้ใน models.py ส่วนด้านครึ่งล่างของรูปจะเป็นการถามว่าจะให้กำหนด superusers หรือไม่ ถ้าต้องการก็จะให้ใส่รายละเอียดต่างๆ 

Playing with the API
มาถึงขั้นตอนสุดท้ายของบทความนี้ เป็นการทดสอบการใช้ API ของ Django จะทดสอบโดยผ่านการ shell ของ python ก่อนก็พิมพ์ Command 
 python manage.py shell  

ทดสอบการใช้ API
โดยสามารถทดลองพิมพ์ตามได้ข้อความด้านล่าง
 In [1]: from polls.models import Poll, Choice  
 # import Poll, Choice เพื่อนำมาใช้ใน shell  
 In [2]: Poll.objects.all() # แสดงจำนวน objects ทั้งหมดใน class Poll 
 Out[2]: []  

 In [3]: from django.utils import timezone  
 # import timezone  
 In [4]: p = Poll(question="What's new?", pub_date=timezone.now())  
 # สร้าง object P จาก class Poll และกำหนดค่าให้ question และ pub_date
 In [5]: p.save()  
 # บันทึกค่าลง Database 
 In [6]: p.id  # แสดงหมายเลข ID ของ object นี้
 Out[6]: 1  
   
 In [7]: p.question  # แสดงค่า attribute question
 Out[7]: "What's new?"  
   
 In [8]: p.pub_date  # แสดงค่า attribute pub_date
 Out[8]: datetime.datetime(2013, 12, 5, 20, 34, 35, 372781, tzinfo=<UTC>)  
   
 In [9]: p.question = "What's up?"  # แก้ไขค่า attribute question ใหม่
   
 In [10]: p.save()  
 # บันทึกค่าลง Database   
 In [11]: Poll.objects.all()  # แสดงจำนวน objects ทั้งหมดใน class Poll 
 Out[11]: [<Poll: Poll object>]  
 # มี object 1 object เพราะได้ทำการสร้างขึ้นมา  
ออกจาก shell ด้วยการกด Ctrl+d จากการทดลองเบื้องต้นจะพบว่า เมื่อเรียกใช้ objects.all() โปรแกรมจะรีเทิร์นค่าซึ่งเราไม่รู้เลยว่า object นี้คืออะไร เราสามารถเพิ่ม function ใน models.py เพื่อให้โปรแกรมรีเทิร์นค่าที่เราต้องการ
models.py
 from django.db import models  
   
 class Poll(models.Model):  
   # ...  
   def __unicode__(self): # Python 3: def __str__(self):  
     return self.question  
   
 class Choice(models.Model):  
   # ...  
   def __unicode__(self): # Python 3: def __str__(self):  
     return self.choice_text  
และเพิ่ม was_published_recently() เพื่อทำการทดลอง API ครั้งถัดไป
models.py
 import datetime  
 from django.utils import timezone  
 # ...  
 class Poll(models.Model):  
   # ...  
   def was_published_recently(self):  
     return self.pub_date >= timezone.now() - datetime.timedelta(days=1)  
จากนั้นทำการเข้า python manage.py shell อีกครั้ง 
 In [1]: from polls.models import Poll, Choice  
 # import Poll, Choice เพื่อนำมาใช้ใน shell  
 In [2]: Poll.objects.all() # ตรวจสอบ function __unicode__() 
 Out[2]: [<Poll: What's up?>] # object ที่ได้
   
 In [3]: Poll.objects.filter(id=1) # ทำการ filter objects ของ class โดยเลือกที่ id=1
 Out[3]: [<Poll: What's up?>] # object ที่ได้
 # ทำการ filter objects ของ class โดยเลือกคำนำหน้าของ question ที่มีคำว่า 'What'     
 In [4]: Poll.objects.filter(question__startswith='What') 
 Out[4]: [<Poll: What's up?>] # object ที่ได้
   
 In [5]: from django.utils import timezone  
 # import timezone เพื่อนำมาใช้ใน shell   
 In [6]: current_year = timezone.now().year  
 # กำหนด current_year เท่ากับปีปัจจุบัน(2013)   
 In [7]: Poll.objects.get(pub_date__year=current_year) # get object ที่มีปีเท่ากับ 2013
 Out[7]: <Poll: What's up?>  # object ที่ได้
   
 In [8]: Poll.objects.get(id=2) # get object ที่มี id = 2 (error เพราะยังไม่มีข้อมูล) 
 ---------------------------------------------------------------------------  
 DoesNotExist Traceback (most recent call last)  
   ...  
 DoesNotExist: Poll matching query does not exist.  
   
 In [9]: Poll.objects.get(pk=1) # get object ที่มี id = 1 
 Out[9]: <Poll: What's up?>  # object ที่ได้
   
 In [10]: p = Poll.objects.get(pk=1) # กำหนดให้ p เป็น object ที่ get มาได้ (id=1)
   
 In [11]: p.was_published_recently() # p เรียกใช้ function was_published_recently()
 Out[11]: True  
 # was_published_recently() จะเช็คว่าผ่านมาเมื่อเร็วๆนีรือไหม(ไม่เกิน 1 วัน)
 In [12]: p = Poll.objects.get(pk=1) # กำหนดให้ p เป็น object ที่ get มาได้ (id=1)
   
 In [13]: p.choice_set.all() # แสดงจำนวนของ objects ของ choice ทั้งหมดใน object Poll นี้ 
 Out[13]: [] # ไม่มี choice ใน Poll นี้
   
 In [14]: p.choice_set.create(choice_text='Not much', votes=0) # สร้าง choice ใน Poll 
 Out[14]: <Choice: Not much> # choice ชื่อ Not much 
   
 In [15]: p.choice_set.create(choice_text='The sky', votes=0) # สร้าง choice ใน Poll  
 Out[15]: <Choice: The sky> # choice ชื่อ The sky 
   
 In [16]: c = p.choice_set.create(choice_text='Just hacking again', votes=0)  
 # กำหนดให้ c เป็น object class Choice ที่สร้างขึ้นมา ชื่อ Just hacking again
 In [17]: c.poll # แสดงชื่อ poll ที่ object นี้มีความสัมพันธ์(foreign key) กัน  
 Out[17]: <Poll: What's up?>  # object ที่ได้
   
 In [18]: p.choice_set.all() # แสดงผลลัพธ์ของ class Choice ที่มีความสัมพันธ์กับ object p นี้  
 Out[18]: [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]  
 # object ที่ได้  
 In [19]: p.choice_set.count() # แสดงจำนวนของ class Choice ที่มีความสัมพันธ์กับ object p นี้  
 Out[19]: 3 # จำนวนที่ได้
 ทำการ filter objects ของ class Choice โดยเลือกจาก class poll ที่มีคำว่า year = current_year
 In [20]: Choice.objects.filter(poll__pub_date__year=current_year)  
 Out[20]: [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]  
 # กำหนดให้ c เป็น object class Choice โดยเลือกจาก p ที่มี choice ขึ้นต้นด้วย 'Just hacking'  
 In [21]: c = p.choice_set.filter(choice_text__startswith='Just hacking')  
   
 In [22]: c.delete() # ลบ object นี้ (<Choice: Just hacking again>)
   
 In [23]: p.choice_set.all() # แสดงผลลัพธ์ของ class Choice ที่มีความสัมพันธ์กับ object p นี้ 
 Out[23]: [<Choice: Not much>, <Choice: The sky>] # object ที่ได้
   
จากที่ได้ทำการทดลองตามที่ผ่านมาขั้นต้น แสดงถึงคำสั่งของ API  พื้นฐานต่างๆไม่ว่าจะเป็น objects.all(), objects.filter(), objects.get(), save(), delete() และ count() จะเห็นถึงผลลัพธ์ในรูปแบบต่างหวังว่าคงเป็นประโยชน์สำหรับผู้ที่ได้ศึกษาและติดตามบทความนี้
คำสั่ง API อื่นๆ ศึกษาต่อได้จาก QuerySet API reference 

Reference
https://docs.djangoproject.com/en/1.6/intro/tutorial01/

ไม่มีความคิดเห็น:

แสดงความคิดเห็น