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

ความรู้เบื้องต้นเกี่ยวกับ
Django Model

Django ORM + Field + Query API

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

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

สร้าง Models และจัดการ Migrations ใน Django

1. Models

  • กำหนดโครงสร้างข้อมูล (fields)
  • อยู่ใน models.py

2. makemigrations

  • สร้าง migrations files
  • คำสั่ง:
    python manage.py makemigrations
                      
  • คำสั่ง: สร้าง migrations files เฉพาะ myapp
    python manage.py migrate myapp
                      
    * สร้าง migrations files ในโฟล์เดอร์ myapp/migrations

3. migrate

  • ปรับปรุงฐานข้อมูล
  • คำสั่ง:
    python manage.py migrate
                      
  • คำสั่ง: ปรับปรุงฐานข้อมูลเฉพาะ myapp
    python manage.py migrate myapp
                      
    * รัน migrations files ในโฟล์เดอร์ myapp/migrations

นำเข้าและส่งออกข้อมูลใน Django

นำเข้าข้อมูล

1. Custom CLI

สร้างคำสั่ง custom เพื่อเพิ่มข้อมูล

                  
# ตัวอย่าง: create_student
python manage.py create_student --name "John Doe" --age 20

# ตัวอย่าง: create_students คำสั่งจำลองข้อมูลนักศึกษาหลายคน
python manage.py create_students
                  
                

* สร้างได้โดยการเขียน custom management command ใน management/commands/

2. loaddata

นำเข้าข้อมูลจากไฟล์ JSON หรือ YAML

                  
# นำเข้าจาก JSON
python manage.py loaddata data.json

# นำเข้าจาก YAML
python manage.py loaddata data.yaml
                  
                

* รองรับ JSON, YAML, XML
* ติดตั้ง pyaml เพื่อให้รองรับไฟล์ในรูปแบบ YAML
* ไฟล์ต้องอยู่ใน fixtures/ directory หรือระบุ path
* บน Windows ก่อนนำเข้า json ไฟล์ จะต้องบันทึกเป็น UTF-8 ก่อน

ส่งออกข้อมูล

dumpdata

ส่งออกข้อมูลเป็น JSON หรือ XML

                
# ส่งออกทั้งหมด
python manage.py dumpdata > data.json

# ส่งออกเฉพาะ app
python manage.py dumpdata myapp > data.json

# ส่งออกเฉพาะ model
python manage.py dumpdata myapp.Student > data.json

# ระบุ format (json, xml, yaml)
python manage.py dumpdata --format xml myapp.Student > data.xml

# ระบุ indent
python manage.py dumpdata --indent 4 myapp.Student > data.json
                
              

* ใช้เพื่อ backup ข้อมูล, ถ่ายโอนข้อมูลระหว่าง environments
* Default format คือ JSON

ทำความเข้าใจโครงสร้างของ
Django Model และ Field

1. Django Model คืออะไร?

  • เป็นคลาสที่ใช้กำหนดโครงสร้างของข้อมูลในฐานข้อมูล
  • ใช้ภาษา Python เพื่อสร้าง schema แทนการเขียน SQL โดยตรง
  • แต่ละ Model จะถูก map ไปเป็นตารางในฐานข้อมูล

2. การสร้าง Model พื้นฐาน

              
from django.db import models

class Student(models.Model):
   name = models.CharField(max_length=100)
   age = models.IntegerField()  # เหมาะไหม?
   email = models.EmailField()
              

โค้ดด้านบนจะสร้างตารางชื่อ student ในฐานข้อมูล พร้อม field name, age และ email

3. ประเภทของ Field ที่ใช้บ่อย

  • CharField – ข้อความสั้น
  • TextField – ข้อความยาว
  • IntegerField – ตัวเลขจำนวนเต็ม
  • FloatField – เลขทศนิยม
  • DateField – วันที่
  • BooleanField – จริง/เท็จ
  • EmailField – อีเมล
  • ForeignKey – ความสัมพันธ์กับ model อื่น

จำลองข้อมูลนักเรียนด้วย Custom Command

สร้างข้อมูลด้วย create_students

ใช้ Custom Management Command เพื่อสร้างข้อมูลนักเรียนจำนวนมาก

              
python manage.py create_students -n 100
              
            

* สร้างนักเรียนจำนวน 100 คนด้วยข้อมูลจำลอง
* -n หรือ --number คือจำนวนนักเรียนที่ต้องการสร้าง

Implementation

              
from django.core.management.base import BaseCommand
from faker import Faker
from myapp.models import Student

class Command(BaseCommand):
  help = 'สร้างข้อมูลนักเรียน (Student)'

  def add_arguments(self, parser):
    parser.add_argument('-n', '--number', type=int, default=10, help='จำนวนนักเรียนที่ต้องการสร้าง')

  def handle(self, *args, **options):
    num_students = options['number']
    fake = Faker('th_TH')

    for _ in range(num_students):
      student = Student(
        name=fake.name(),
        dob=fake.date_of_birth(minimum_age=18, maximum_age=30),
        email=fake.email()
      )
      student.save()

    self.stdout.write(self.style.SUCCESS(f'สร้างนักเรียน {num_students} คนเรียบร้อย'))
              
            

* ใช้ library faker เพื่อสร้างข้อมูลสุ่ม
* ต้องติดตั้ง pip install faker
* ปรับแก้ code ให้เหมาะสมกับ Model และ fields ของคุณ

Query ข้อมูลนักศึกษาและแสดงผลใน Template

ลำดับการทำงาน

  1. 1. Query ข้อมูลใน View Function: ดึงข้อมูลนักศึกษาจากฐานข้อมูลโดยใช้ Django ORM (QuerySet)
                      
    from django.shortcuts import render
    from .models import Student
    
    def student_list(request):
      students = Student.objects.all()  # หรือใช้ .filter(), .exclude() ตามต้องการ
      context = {'students': students}
      return render(request, 'students.html', context)
                      
                    
  2. 2. สร้าง Context: เตรียมข้อมูล (context) ที่จะส่งไปยัง template (`students.html`)

    Context คือ dictionary ที่มี key เป็นชื่อตัวแปร และ value เป็นข้อมูลที่ต้องการส่ง

  3. 3. Render Template: ใช้ function `render()` เพื่อสร้าง HTML page จาก template (`students.html`) โดยส่ง context ไปด้วย
  4. 4. แสดงผลข้อมูลใน Template: ใน `students.html` ใช้ Django Template Language (DTL) เพื่อวน loop และแสดงข้อมูลนักศึกษา
    
      <ul>
        {% for student in students %}
        <li>
          <h2>{{ student.name }}</h2>
          <p>Email: {{ student.email }}</p>
          <img src="https://robohash.org/set_set2/bgset_bg2/{{ student.id }}" alt="Avatar">
        </li>
        {% endfor %}
      </ul>
    
                    

    * {{ student.name }}, {{ student.email }} คือตัวแปรที่ดึงค่าจาก Student object
    * {% for student in students %} คือ loop ที่วนซ้ำตามจำนวนนักศึกษาใน `students` list

QuerySet และการค้นหาข้อมูลนักศึกษา

1. QuerySet คืออะไร?

  • เป็น object ที่ represent ชุดของข้อมูลที่ query จาก database
  • เป็น lazy evaluation: จะ execute query จริงๆ เมื่อต้องการใช้ข้อมูล
  • รองรับ method chaining: สามารถเรียก method หลายๆ ตัวต่อกันได้

2. คำสั่งค้นหาพื้นฐาน

              
# ดึงนักศึกษาทั้งหมด
Student.objects.all()

# ดึงนักศึกษาที่มีชื่อ "John Doe"
Student.objects.filter(name="John Doe")

# ดึงนักศึกษาที่มีอีเมลลงท้ายด้วย "@example.com"
Student.objects.filter(email__endswith="@example.com")

# ดึงนักศึกษาที่ไม่ชื่อ "Jane Doe"
Student.objects.exclude(name="Jane Doe")

# ดึงนักศึกษาคนแรกที่มีชื่อ "John Doe" (ถ้ามี)
Student.objects.get(name="John Doe") # ระวัง: ถ้าไม่มี หรือมีมากกว่า 1 จะ error
              
            

* filter() คืนค่า QuerySet (อาจมีหลาย record หรือไม่มีเลย)
* get() คืนค่า object เดียว (ต้องมีเพียง record เดียวเท่านั้น)
* exclude() คืนค่า QuerySet ที่ไม่ตรงกับเงื่อนไข

3. ตัวอย่างการใช้ Lookup Expression

  • exact: ตรงกันพอดี (default) → name__exact="John Doe" (เหมือน name="John Doe")
  • iexact: ตรงกันพอดี (ไม่สนใจตัวพิมพ์เล็ก-ใหญ่) → name__iexact="john doe"
  • contains: มีข้อความ → email__contains="example"
  • icontains: มีข้อความ (ไม่สนใจตัวพิมพ์เล็ก-ใหญ่) → email__icontains="EXAMPLE"
  • startswith: ขึ้นต้นด้วย → name__startswith="J"
  • istartswith: ขึ้นต้นด้วย (ไม่สนใจตัวพิมพ์เล็ก-ใหญ่) → name__istartswith="j"
  • endswith: ลงท้ายด้วย → email__endswith=".com"
  • date, year, month, day: สำหรับ DateField (dob) → dob__year=2000
  • range: อยู่ในช่วง → dob__range=(date(1990, 1, 1), date(2000, 12, 31))

* Lookup Expressions ใช้เพื่อกำหนดเงื่อนไขในการ query ข้อมูล
* สามารถใช้ร่วมกับ filter() และ exclude()

การจัดการข้อมูลในฐานข้อมูล (CRUD)

เรียนรู้การใช้ Django ORM ในการ เพิ่ม, แก้ไข, และ ลบ ข้อมูล

🟢 เพิ่มข้อมูล (Create)

                
# สร้างและบันทึกข้อมูลใหม่
from datetime import date

student = Student(name="สมศรี ใจดี", email="somsri@example.com", dob=date(2005, 5, 10))
student.save()

# หรือใช้ create()
Student.objects.create(name="สมศรี ใจดี", email="somsri@example.com", dob=date(2005, 5, 10))
                
              

🟡 แก้ไขข้อมูล (Update)

                
# แก้ไขข้อมูลของนักเรียน
student = Student.objects.get(id=1)
student.email = "somsri.updated@example.com"
student.save()
                
              

🔴 ลบข้อมูล (Delete)

                
# ลบข้อมูลนักเรียน
student = Student.objects.get(id=1)
student.delete()
                
              

💻 Lab: จัดการข้อมูลนักเรียน

แบบฝึกหัดการใช้ Django ORM เพื่อ เพิ่ม, แก้ไข, และ ลบ ข้อมูลในฐานข้อมูล
🟢 เพิ่มข้อมูลนักเรียน
➤ ใช้ `Student.objects.create(...)` หรือสร้าง instance แล้ว `save()`
🟡 แก้ไขข้อมูลนักเรียน
➤ ดึง object ด้วย `.get()` แล้วเปลี่ยนค่า attribute ตามที่กำหนด
🔴 ลบข้อมูลนักเรียน
➤ ใช้ `.delete()` เพื่อลบ object จากฐานข้อมูล
คำแนะนำ: ให้ทดลองรันคำสั่งใน python manage.py shell
เวลา: 1 ชั่วโมง

🌐 การแสดงข้อมูลบนหน้าเว็บ

แสดงข้อมูลนักเรียนจากฐานข้อมูลไปยังหน้าเว็บไซต์ด้วย Django
🔹 1. เขียน View
➤ ใช้ Student.objects.all() เพื่อดึงข้อมูลทั้งหมด
➤ ส่ง context ไปยัง template
🔹 2. สร้าง Template
➤ วนลูปแสดงข้อมูลด้วย {% for student in students %}
➤ ใช้ Django template language เช่น {{ student.name }}
🔹 3. เชื่อมโยง URL
➤ เพิ่ม path ใน urls.py ให้ชี้มาที่ view นั้น
✅ ตัวอย่างการแสดง: รายชื่อนักเรียน | คะแนนสอบ | เกรดเฉลี่ย
เวลา: 1 ชั่วโมง

ทบทวน: การแสดงข้อมูลด้วย Django

Model: กำหนดโครงสร้างข้อมูลใน `models.py` เช่น Student(name, score)
Migration: ใช้ `makemigrations` และ `migrate` เพื่อสร้างตารางในฐานข้อมูล
Data: เพิ่มข้อมูลด้วย admin หรือ shell เช่น `Student.objects.create(...)`
View: ดึงข้อมูลจาก model เช่น `Student.objects.all()` และส่งไปยัง template
Template: ใช้ `for` loop และ `{{ }}` เพื่อแสดงข้อมูลใน HTML
URL: เชื่อมเส้นทางกับ view ผ่าน `urls.py`
Laboratory time.

🛠 ภาคปฏิบัติ: แสดงข้อมูลจากฐานข้อมูล

1️⃣ สร้าง Model Book(title, author, year) ใน models.py
2️⃣ รันคำสั่ง makemigrations และ migrate เพื่อสร้างตาราง
3️⃣ เพิ่มข้อมูลหนังสือใน Django Admin หรือ Shell (เช่น 5 รายการ)
4️⃣ สร้าง View เพื่อดึงข้อมูล: Book.objects.all()
5️⃣ เขียน Template (HTML) เพื่อแสดงรายชื่อหนังสือทั้งหมด
6️⃣ เชื่อม URL เข้ากับ View ที่สร้างไว้
⏱ ใช้เวลา: 60 นาที
🧑‍💻 แนะนำให้ทำเป็นกลุ่มละ 2 คน / ครูเดินดู-แนะนำเป็นรายกลุ่ม

🔍 ภาคปฏิบัติ: สร้างหน้าแสดงรายละเอียด

1️⃣ เพิ่ม URL: /books/<id>/ สำหรับดูรายละเอียดแต่ละเล่ม
2️⃣ เขียน View ฟังก์ชันใหม่ (หรือใช้ DetailView) เพื่อดึง Book ตาม ID
3️⃣ สร้าง Template ชื่อ book_detail.html ที่แสดง title, author, year
4️⃣ เพิ่มปุ่ม "ดูรายละเอียด" ที่ลิงก์จากหน้า list ไปยังหน้า detail
5️⃣ ทดสอบเปิดแต่ละรายการในเบราว์เซอร์ให้ถูกต้อง
⏱ ใช้เวลา: 45–60 นาที
💡 เสริมแนวคิด: URL parameter, template inheritance, error handling