models.Model
CharField - ข้อความสั้น มีความยาวจำกัดTextField - ข้อความยาว ไม่จำกัดความยาวIntegerField - ตัวเลขจำนวนเต็มFloatField - ตัวเลขทศนิยมBooleanField - ค่าจริง/เท็จ (True/False)DateField / DateTimeField - วันที่ / วันเวลาEmailField - อีเมลForeignKey - ความสัมพันธ์กับโมเดลอื่น
from django.db.models import Count
# นับจำนวนนักเรียนทั้งหมด
total_students = Student.objects.count()
# นับจำนวนนักเรียนที่ใช้อีเมล @example.com
example_students = Student.objects.filter(email__endswith="@example.com").count()
print(f"จำนวนนักเรียนทั้งหมด: {total_students}")
print(f"จำนวนนักเรียนที่ใช้อีเมล @example.com: {example_students}")
* Count ใช้เพื่อนับจำนวน records
* สามารถใช้ filter ร่วมกับ count เพื่อกรองข้อมูลก่อนนับ
from django.db.models import Q
# กรองนักเรียนที่ชื่อขึ้นต้นด้วย 'A' หรือใช้อีเมล @example.com
filtered_students = Student.objects.filter(
Q(name__startswith='A')
| Q(email__endswith='@example.com')
)
# นับจำนวนนักเรียนที่ผ่านการกรอง
filtered_count = filtered_students.count()
print(f"จำนวนนักเรียนที่ชื่อขึ้นต้นด้วย 'A' หรือใช้อีเมล @example.com: {filtered_count}")
* Q object ใช้เพื่อสร้างเงื่อนไขที่ซับซ้อนขึ้น (เช่น OR, AND)
* annotate สามารถใช้เพื่อเพิ่ม field ใหม่ให้กับแต่ละ object ใน QuerySet (ไม่ได้แสดงในตัวอย่างนี้ แต่เป็น concept ที่เกี่ยวข้อง)
# ดึงเฉพาะชื่อและอีเมลของนักเรียนทุกคน
student_names_emails = Student.objects.values('name', 'email')
for student in student_names_emails:
print(f"ชื่อ: {student['name']}, อีเมล: {student['email']}")
# ดึงเฉพาะชื่อและอีเมลของนักเรียนทุกคนในรูปแบบ list
student_names_emails_list = Student.objects.values_list('name', 'email')
for name, email in student_names_emails_list:
print(f"ชื่อ: {name}, อีเมล: {email}")
* values ดึงข้อมูลเป็น dictionary
* values_list ดึงข้อมูลเป็น tuple
* ใช้เพื่อดึงเฉพาะ fields ที่ต้องการ ทำให้ query เร็วขึ้น
ความสัมพันธ์แบบหลาย-ต่อ-หนึ่ง (Many-to-One)
class Book(models.Model):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
ความสัมพันธ์แบบหลาย-ต่อ-หลาย (Many-to-Many)
class Student(models.Model):
courses = models.ManyToManyField(Course)
ความสัมพันธ์แบบหนึ่ง-ต่อ-หนึ่ง (One-to-One)
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
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)
# ดึงหนังสือทั้งหมดของผู้เขียนชื่อ '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)
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)
# ดึงโปรไฟล์ของผู้ใช้ 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!')
class Student(models.Model):
name = models.CharField(max_length=100)
class Course(models.Model):
title = models.CharField(max_length=200)
students = models.ManyToManyField(Student)
# ดึงคอร์สทั้งหมดของนักเรียนชื่อ '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)
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)
# ดึงรายชื่อนักเรียนที่ลงทะเบียนคอร์ส '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')