อัปเดตล่าสุด April 5, 2023
Django เป็นเฟรมเวิร์คในรูปแบบที่ใช้ ORM (Object Relational Mapping) คอนเซ็ปต์ในการปฏิสัมพันธ์กับฐานข้อมูล โดยเขียนภาษา Python แทนที่จะใช้ภาษา SQL ในการสร้างหรือติดต่อกับฐานข้อมูล ในส่วนนี้เราจะเรียกว่า "Django Model" โดยมักจะอ้างถึงตารางของฐานข้อมูล ในบทความนี้เราจะมีทำความเข้าใจกับ Django Model และ Django ORM ว่ามันคืออะไร คอนเซ็ปต์เป็นอย่างไรบ้างครับ
ORM (Object Relational Mapping) คือ การเขียนไพธอนเพื่อติดต่อกับฐานข้อมูลโดยไม่จำเป็นต้องเขียนภาษา SQL แบบปกติทั่วไป
มาดูคอนเซ็ปต์ของ Django ORM กันครับ ปกติแล้วเราก็สามารถเขียน Raw SQL ใน Django ได้ แต่การใช้ ORM ก็เป็นมาตรฐานที่ใช้กัน ส่วน Raw SQL จะใช้ก็ต่อเมื่อการ query ด้วยเมธอดของ Django นั้นเกิดข้อจำกัด ในกรณีที่ต้องการ custom query ที่มีความซับซ้อน
เราจะมาทำการสร้างตาราง โดยตารางด้านล่างมีชื่อว่า "Post"
Post
ID | Title | Body |
1 | Django 101 | Django is ..... |
2 | Basic Python | Learning Python ... |
3 | Python OOP | OOP is a core concept ... |
ถ้านำไปเขียนเป็นภาษา SQL จะได้
CREATE TABLE "post" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"title" varchar(80) NOT NULL,
"body" text NOT NULL,
)
และนำไปเขียนเป็น Django Model จะได้การเขียนเพื่อสร้างตารางได้แบบนี้
class Post(models.Model):
title = models.CharField(max_length=80)
body = models.TextField()
Note: ในส่วนของฟีลด์ ID นั้น Django จะสร้างให้เราอัตโนมัติ (ไม่ต้องสร้างเอง)
Django Model คือส่วนที่ติดต่อกับฐานข้อมูลหรือส่วนหลังบ้าน โดยผมได้นำเอาสองหัวข้อนี้มาเขียนไว้ในบทความเดียว เพราะว่าเป็นคอนเซ็ปต์ที่อยู่ในประเภทเดียวกัน ถ้าสังเกตจากภาพไดอะแกรมด้านล่างจะเห็นว่า M ก็คือ Model นี่เอง ซึ่งเป็น Django MVT Design Patterns โดย model จะอยู่ในส่วนที่ต้องประสานงานกับ database จะมี view ซึ่งเป็นตัวกลางไว้ใช้สำหรับเขียน business logic หรือพวกการ query ข้อมูลจาก model แล้ว response กับไปที่ client
Django MTV
Django จะมีโมดูลในส่วนของการจัดการ model คือ django.db.models โดยอิมพอร์ตเข้ามาได้แบบนี้ (Django อิมพอร์ตมาให้ในตัวแล้ว)
from django.db import models
ลองสร้าง Django Model ขึ้นมา
models.py
class Post(models.Model):
title = models.CharField(max_length=80)
short_description = models.TextField(max_length=160)
body = models.TextField()
date_created = models.DateTimeField(auto_now_add=True,)
date_updated = models.DateTimeField(auto_now=True)
featured_image = models.ImageField(upload_to="featured_images")
จากโค้ดด้านบนเราจะสร้างคลาส (ตาราง) ที่มีชื่อว่า Post ขึ้นมาและภายในคลาสจะสร้างฟีลด์ (คอลัมน์) เพื่อเก็บข้อมูลขึ้นมาอีก 6 ฟีลด์ไล่ตั้งแต่ title ... ไปจนถึง featured_image โดยแต่ละฟีลด์ก็จะเก็บข้อมูลที่แตกต่างกัน เช่น title จะเก็บข้อมูลแบบตัวอักษร CharField() หรือ featured_image ก็จะเก็บข้อมูลประเภทรูปภาพ ImageField() เป็นต้น
ปกติ Django จะรีเทิร์นหมายเลขของออปเจ็คท์ออกมา ถ้าเราไม่ได้ใช้ def __str__(self): เมธอด ลองเปิดดูที่หน้าแอดมินจะเห็นว่า
Django จะรีเทิร์นหมายเลขออปเจ็คท์ออกมา
แต่ถ้าเราใช้ String method ซึ่งเป็นเมธอดพิเศษของไพธอน หรือเรียกได้อีกอย่างว่า dunder method โดยสังเกตง่าย ๆ คือจะมี double underscores (อันเดอร์สกอร์ 2 ตัวติดกันคั่นด้วยชื่อเมธอด)
def __str__(self):
return self.title
เมื่อนำมาใส่ในคลาสจาก Model ก่อนหน้า
class Post(models.Model):
title = models.CharField(max_length=80)
...
featured_image = models.ImageField(upload_to="featured_images")
def __str__(self):
return self.title
มาดูว่าในหน้าแอดมินจะเป็นอย่างไร
Django รีเทิร์น title ออกมาแทนออปเจ็คท์ ทำให้อ่านง่ายกว่าเดิม
จะเห็นว่าตอนนี้ออปเจ็คท์จะถูกรีเทิร์นออกมาเป็นชื่อบทความ ตามที่เราได้รีเทิร์นค่า title ออกมาใน string method ซึ่งทำให้พอเปิดเข้ามาดูที่หน้าแอดมินจะทำให้เข้าใจได้ง่ายกว่าเดิม
เมื่อเราดีไซน์ database เสร็จแล้วนั้น เราก็ต้องเลือกใช้ field ที่เหมาะสมกับตารางที่ดีไซน์ไว้ เช่น ถ้าต้องการเก็บชื่อบทความความ ก็ใช้ CharField() ต้องการเก็บรูปภาพปกบทความก็ใช้ ImageField() เป็นต้น ด้านล่างคือตัวอย่าง Django Model Fields ที่มักถูกใช้อยู่บ่อย ๆ
คอร์สอบรม เรียนทำเว็บ ด้วย Django สุดยอด web framework อันดับ 1 ที่ได้รับ…
พัฒนา REST APIs ด้วยสุดยอด toolkit ของ Django ในการทำ API โดยเฉพาะอย่าง …