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=2000
range
: อยู่ในช่วง → 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