ใน 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_APPSDjangoTutorial/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 Pollmodels.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/
ไม่มีความคิดเห็น:
แสดงความคิดเห็น