แผนการเรียนรู้
/

ความรู้ขั้นสูงเกี่ยวกับ
Django Model

Django ORM + Model Field + QuerySet API

ผลลัพธ์การเรียนรู้

1
อธิบายรูปแบบการกำหนดรูปแบบการจัดเก็บข้อมูลของ Django ได้
2
ประยุกต์ใช้ฟิลด์ (Field) ใน Model ได้
3
ประยุกต์ใช้คำสั่งค้นหา (Query) ได้ตรงตามเงื่อนไขที่กำหนดให้
สัปดาห์ที่ 4

ทำความเข้าใจ
Django Model คืออะไร?

โมเดล (Model) คือชั้นจัดการข้อมูลของ Django ที่เชื่อมกับฐานข้อมูล
เป็นคลาส Python ที่สืบทอดจาก models.Model
ใช้ในการกำหนดโครงสร้างตารางในฐานข้อมูล
กำหนด Field และความสัมพันธ์ (Relationship) ระหว่างข้อมูล
สามารถใช้ Model ในการสร้าง ฟอร์ม และเชื่อมกับ View/Template ได้
พื้นฐานที่ควรรู้

Fields ที่ใช้บ่อยใน Django Model

ฟิลด์คือชนิดข้อมูลที่ใช้กำหนดคอลัมน์ในตารางฐานข้อมูล
CharField - ข้อความสั้น มีความยาวจำกัด
TextField - ข้อความยาว ไม่จำกัดความยาว
IntegerField - ตัวเลขจำนวนเต็ม
FloatField - ตัวเลขทศนิยม
BooleanField - ค่าจริง/เท็จ (True/False)
DateField / DateTimeField - วันที่ / วันเวลา
EmailField - อีเมล
ForeignKey - ความสัมพันธ์กับโมเดลอื่น
Field ที่นักพัฒนาต้องรู้

ความสัมพันธ์ระหว่าง
Models ใน Django

เชื่อมโยงข้อมูลระหว่างตารางด้วย Relationship Fields

ForeignKey

ความสัมพันธ์แบบหลาย-ต่อ-หนึ่ง (Many-to-One)

class Book(models.Model):
   author = models.ForeignKey(Author, on_delete=models.CASCADE)
              

ManyToManyField

ความสัมพันธ์แบบหลาย-ต่อ-หลาย (Many-to-Many)

class Student(models.Model):
   courses = models.ManyToManyField(Course)
              

OneToOneField

ความสัมพันธ์แบบหนึ่ง-ต่อ-หนึ่ง (One-to-One)

class Profile(models.Model):
   user = models.OneToOneField(User, on_delete=models.CASCADE)
              
ความสัมพันธ์ที่ใช้บ่อย

ตัวอย่าง Many-to-One
และ Query ใน Django

สร้างความสัมพันธ์ระหว่างโมเดล และดึงข้อมูลด้วย QuerySet

Model Example

class Author(models.Model):
   name = models.CharField(max_length=100)

class Book(models.Model):
   title = models.CharField(max_length=200)
   author = models.ForeignKey(Author, on_delete=models.CASCADE)
              

Query Example

# ดึงหนังสือทั้งหมดของผู้เขียนชื่อ 'Alice'
books_by_alice = Book.objects.filter(author__name='Alice')

# ดึงผู้เขียนของหนังสือชื่อ 'Django Tips'
author_of_book = Book.objects.get(title='Django Tips').author

# ดึงชื่อหนังสือทั้งหมดที่มีผู้เขียนเป็น 'Bob'
titles = Book.objects.filter(author__name='Bob').values_list('title', flat=True)
              
เขียน Model และ Query เบื้องต้น

ตัวอย่าง One-to-One
และ Query ใน Django

การเชื่อมโยงข้อมูลแบบหนึ่ง-ต่อ-หนึ่ง และการดึงข้อมูล

Model Example

class User(models.Model):
   username = models.CharField(max_length=50)

class Profile(models.Model):
   user = models.OneToOneField(User, on_delete=models.CASCADE)
   bio = models.TextField(blank=True)
              

Query Example

# ดึงโปรไฟล์ของผู้ใช้ username 'john'
profile = Profile.objects.get(user__username='john')

# ดึงชื่อผู้ใช้จากโปรไฟล์ที่มี id=5
username = Profile.objects.get(id=5).user.username

# สร้างโปรไฟล์ใหม่สำหรับผู้ใช้
user = User.objects.create(username='mary')
profile = Profile.objects.create(user=user, bio='Hello Mary!')
              
One-to-One Relationship

ตัวอย่าง Many-to-Many
และ Query ใน Django

ความสัมพันธ์หลาย-ต่อ-หลาย ระหว่างโมเดล และวิธีดึงข้อมูล

Model Example

class Student(models.Model):
   name = models.CharField(max_length=100)

class Course(models.Model):
   title = models.CharField(max_length=200)
   students = models.ManyToManyField(Student)
              

Query Example

# ดึงคอร์สทั้งหมดของนักเรียนชื่อ 'Tom'
courses_of_tom = Course.objects.filter(students__name='Tom')

# ดึงนักเรียนทั้งหมดที่ลงเรียนคอร์สชื่อ 'Math 101'
students_in_math = Student.objects.filter(course__title='Math 101')

# เพิ่มนักเรียน 'Anna' ลงในคอร์ส 'Physics'
physics = Course.objects.get(title='Physics')
anna = Student.objects.get(name='Anna')
physics.students.add(anna)
              
Many-to-Many Relationship

เริ่มภาคปฏิบัติ
Workshop Django Model ขั้นสูง

ภาคปฏิบัติรวม 3 ชั่วโมง
เน้นลงมือเขียน Model และ Query ด้วยตัวเอง
  • ออกแบบและสร้าง Model ด้วยความสัมพันธ์แบบต่าง ๆ (ForeignKey, OneToOne, ManyToMany)
  • ฝึกเขียน Query เพื่อค้นหาข้อมูลตามเงื่อนไขจริง
  • ใช้งาน Django Admin เพื่อตรวจสอบข้อมูลที่เพิ่มและแก้ไข
  • ทำความเข้าใจการจัดการข้อมูลแบบสัมพันธ์อย่างลึกซึ้ง
เตรียมตัวให้พร้อม เริ่มลงมือกันเลย!

ภาคปฏิบัติด้วยตัวอย่าง
ระบบ Online Classroom

ออกแบบโมเดลและความสัมพันธ์สำหรับระบบห้องเรียนออนไลน์
  • สร้างโมเดล Student, Course, Instructor และ Enrollment
  • กำหนดความสัมพันธ์แบบ One-to-Many และ Many-to-Many
  • ฝึกเขียน Query เพื่อค้นหานักเรียนที่ลงทะเบียนในคอร์สใดคอร์สหนึ่ง
  • เขียน Query เพื่อดึงข้อมูลผู้สอนของคอร์สต่าง ๆ
  • เพิ่มข้อมูลตัวอย่างและตรวจสอบผ่าน Django Admin
ลงมือทำและเรียนรู้เชิงลึก

ตัวอย่างโค้ด Model
ระบบ Online Classroom

กำหนดความสัมพันธ์ระหว่าง Student, Course, Instructor และ Enrollment
from django.db import models

class Instructor(models.Model):
   name = models.CharField(max_length=100)
   email = models.EmailField()

class Course(models.Model):
   title = models.CharField(max_length=200)
   instructor = models.ForeignKey(Instructor, on_delete=models.CASCADE)

class Student(models.Model):
   name = models.CharField(max_length=100)
   email = models.EmailField()

class Enrollment(models.Model):
   student = models.ForeignKey(Student, on_delete=models.CASCADE)
   course = models.ForeignKey(Course, on_delete=models.CASCADE)
   enrolled_at = models.DateTimeField(auto_now_add=True)
            
ออกแบบ Model และความสัมพันธ์

ตัวอย่างการเขียน Query
ระบบ Online Classroom

ตัวอย่างคำสั่ง Query เพื่อดึงข้อมูลต่าง ๆ จากฐานข้อมูล
# ดึงรายชื่อนักเรียนที่ลงทะเบียนคอร์ส 'Python Basics'
students_in_python = Student.objects.filter(enrollment__course__title='Python Basics')

# ดึงคอร์สทั้งหมดที่อาจารย์ชื่อ 'Ajarn Somchai' สอน
courses_by_somchai = Course.objects.filter(instructor__name='Ajarn Somchai')

# ดึงอีเมลนักเรียนที่ลงทะเบียนในคอร์สที่มีคำว่า 'Data' ในชื่อ
emails = Student.objects.filter(enrollment__course__title__icontains='Data').values_list('email', flat=True)

# ดึงข้อมูล enrollment ของนักเรียนคนหนึ่ง พร้อมคอร์สที่ลงทะเบียน
enrollments = Enrollment.objects.select_related('student', 'course').filter(student__name='Napat')
            
ฝึกเขียน Query ค้นหาข้อมูลตามเงื่อนไข