models.py
python manage.py makemigrations
python manage.py migrate myapp
* สร้าง migrations files ในโฟล์เดอร์ myapp/migrations
python manage.py migrate
python manage.py migrate myapp
* รัน migrations files ในโฟล์เดอร์ myapp/migrations
สร้างคำสั่ง 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/
นำเข้าข้อมูลจากไฟล์ 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 ก่อน
ส่งออกข้อมูลเป็น 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
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
CharField – ข้อความสั้นTextField – ข้อความยาวIntegerField – ตัวเลขจำนวนเต็มFloatField – เลขทศนิยมDateField – วันที่BooleanField – จริง/เท็จEmailField – อีเมลForeignKey – ความสัมพันธ์กับ model อื่นcreate_studentsใช้ Custom Management Command เพื่อสร้างข้อมูลนักเรียนจำนวนมาก
python manage.py create_students -n 100
* สร้างนักเรียนจำนวน 100 คนด้วยข้อมูลจำลอง
* -n หรือ --number คือจำนวนนักเรียนที่ต้องการสร้าง
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 ของคุณ
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)
Context คือ dictionary ที่มี key เป็นชื่อตัวแปร และ value เป็นข้อมูลที่ต้องการส่ง
<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
# ดึงนักศึกษาทั้งหมด
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 ที่ไม่ตรงกับเงื่อนไข
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=2000range: อยู่ในช่วง → dob__range=(date(1990, 1, 1), date(2000, 12, 31))
* Lookup Expressions ใช้เพื่อกำหนดเงื่อนไขในการ query ข้อมูล
* สามารถใช้ร่วมกับ filter() และ exclude()
# สร้างและบันทึกข้อมูลใหม่
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))
# แก้ไขข้อมูลของนักเรียน
student = Student.objects.get(id=1)
student.email = "somsri.updated@example.com"
student.save()
# ลบข้อมูลนักเรียน
student = Student.objects.get(id=1)
student.delete()
python manage.py shell
Student.objects.all() เพื่อดึงข้อมูลทั้งหมด{% for student in students %}{{ student.name }}
urls.py ให้ชี้มาที่ view นั้น
Book(title, author, year) ใน models.py
makemigrations และ migrate เพื่อสร้างตาราง
Book.objects.all()
/books/<id>/ สำหรับดูรายละเอียดแต่ละเล่ม
DetailView) เพื่อดึง Book ตาม ID
book_detail.html ที่แสดง title, author, year