Django ORM & Models

   อัปเดตล่าสุด April 5, 2023

Django เป็นเฟรมเวิร์คในรูปแบบที่ใช้ ORM (Object Relational Mapping) คอนเซ็ปต์ในการปฏิสัมพันธ์กับฐานข้อมูล โดยเขียนภาษา Python แทนที่จะใช้ภาษา SQL ในการสร้างหรือติดต่อกับฐานข้อมูล ในส่วนนี้เราจะเรียกว่า "Django Model" โดยมักจะอ้างถึงตารางของฐานข้อมูล ในบทความนี้เราจะมีทำความเข้าใจกับ Django Model และ Django ORM ว่ามันคืออะไร คอนเซ็ปต์เป็นอย่างไรบ้างครับ


Django ORM คืออะไร ?

ORM (Object Relational Mapping) คือ การเขียนไพธอนเพื่อติดต่อกับฐานข้อมูลโดยไม่จำเป็นต้องเขียนภาษา SQL แบบปกติทั่วไป


ORM คอนเซ็ปต์

มาดูคอนเซ็ปต์ของ 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 ORM

  • เขียน Python คลาส/ออปเจ็คท์ เพื่อติดต่อฐานข้อมูลโดยไม่ต้องเขียน SQL
  • ช่วยให้พัฒนาโปรเจคท์ได้อย่างรวดเร็ว เพราะไม่จำเป็นต้องมีความรู้ภาษา SQL (แต่แน่นอนว่าถ้ามีก็จะดีกว่าแน่ ๆ เพราะเข้าใจเบื้องลึกเบื้องหลังคำสั่ง SQL)


Django Model คืออะไร ?

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()  เป็นต้น


สตริงเมธอด def __str__(self):

ปกติ 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 ซึ่งทำให้พอเปิดเข้ามาดูที่หน้าแอดมินจะทำให้เข้าใจได้ง่ายกว่าเดิม


Model Fields

เมื่อเราดีไซน์ database เสร็จแล้วนั้น เราก็ต้องเลือกใช้ field ที่เหมาะสมกับตารางที่ดีไซน์ไว้ เช่น ถ้าต้องการเก็บชื่อบทความความ ก็ใช้   CharField() ต้องการเก็บรูปภาพปกบทความก็ใช้   ImageField()   เป็นต้น  ด้านล่างคือตัวอย่าง Django Model Fields ที่มักถูกใช้อยู่บ่อย ๆ




คอร์สเรียนแนะนำ

พัฒนาเว็บไซต์ด้วย Django Python

คอร์สอบรม เรียนทำเว็บ ด้วย Django สุดยอด web framework อันดับ 1 ที่ได้รับ…

Building API with Django REST Framework

พัฒนา REST APIs ด้วยสุดยอด toolkit ของ Django ในการทำ API โดยเฉพาะอย่าง …