0
0
Lập trình
Admin Team
Admin Teamtechmely

Hiểu về Django Managers: Cổng kết nối dữ liệu của bạn

Đăng vào 5 tháng trước

• 5 phút đọc

Giới thiệu

Khi làm việc với các mô hình Django, bạn không chỉ định nghĩa các bảng mà còn định nghĩa cách tương tác với chúng. Trong bài viết này, chúng ta sẽ khám phá một trong những công cụ mạnh mẽ của Django để thực hiện các truy vấn, đó là Django managers. Django managers định nghĩa giao diện cho việc tương tác giữa mã của bạn và cơ sở dữ liệu. Manager mặc định mà hầu hết mọi người sử dụng là "objects" như trong "students.objects.all()".

Ví dụ cơ bản

Để hiểu rõ hơn, hãy xem một ví dụ cơ bản dưới đây:

python Copy
class Student(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()

# Sử dụng manager mặc định
all_students = Student.objects.all()
adults = Student.objects.filter(age__gte=18)

Tạo một Custom Manager

Bên cạnh manager mặc định, chúng ta cũng có thể tạo ra các custom managers. Nhưng tại sao lại cần điều này? Trong khi objects hữu ích khi thực hiện các truy vấn cơ bản, khi làm việc với các dự án lớn hơn, custom managers cung cấp logic tái sử dụng do người dùng định nghĩa trong mã. Hãy xem một ví dụ thực tế về điều này bằng cách sử dụng models của Django. Chúng ta sẽ định nghĩa một lớp kế thừa từ nó và ghi đè phương thức get_queryset trong manager của sinh viên.

python Copy
class ActiveStudentManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(is_active=True)

class Student(models.Model):
    name = models.CharField(max_length=100)
    is_active = models.BooleanField(default=True)

    objects = models.Manager()        # Manager mặc định
    active = ActiveStudentManager()   # Custom manager

Sử dụng Custom Manager

Vậy làm thế nào để bạn sử dụng custom manager này? Hãy xem ví dụ dưới đây:

python Copy
Student.objects.all()   # trả về tất cả sinh viên
Student.active.all()    # chỉ trả về sinh viên đang hoạt động

Thêm Phương thức Tùy chỉnh vào Managers

Bạn cũng có thể thêm các phương thức vào model managers để thực hiện các hành động hoặc truy vấn cụ thể. Một ví dụ là sắp xếp sinh viên theo nhóm tuổi.

python Copy
class StudentManager(models.Manager):
    def teenagers(self):
        return self.filter(age__gte=13, age__lte=19)

    def adults(self):
        return self.filter(age__gte=18)

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

    objects = StudentManager()  

Sử dụng các phương thức đã thêm

Sau đó, bạn có thể sử dụng như sau:

python Copy
Student.objects.teenagers()  # tất cả sinh viên từ 13-19 tuổi
Student.objects.adults()     # tất cả sinh viên từ 18 tuổi trở lên

Nhiều Managers trong Một Model

Như đã thấy trong ví dụ đầu tiên, bạn có thể thêm nhiều hơn 1 manager vào một model để dễ dàng và tối ưu hóa việc sử dụng.

python Copy
class ActiveStudentManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(is_active=True)

class Student(models.Model):
    name = models.CharField(max_length=100)
    is_active = models.BooleanField(default=True)

    objects = models.Manager()        # Manager mặc định
    active = ActiveStudentManager()   # Custom manager

Managers và QuerySets

Các managers không phải là querysets. Managers là điểm vào cơ sở dữ liệu trong khi QuerySets đại diện cho bộ sưu tập bản ghi thực tế. Trong bài viết tiếp theo, chúng ta sẽ xem cách sử dụng Querysets.

Lưu ý quan trọng

Một model có thể có nhiều managers, nhưng chỉ có một manager mặc định, đó là objects; tuy nhiên điều này có thể thay đổi.

python Copy
class Student(models.Model):
    name = models.CharField(max_length=100)
    is_active = models.BooleanField(default=True)

    objects = models.Manager()       # mặc định
    active = ActiveStudentManager()  # tùy chỉnh

Lưu ý: Manager mặc định được sử dụng trong admin và migrations, vì vậy hãy luôn giữ objects = models.Manager() trừ khi bạn biết mình đang làm gì.

Chúng ta đã thấy cách mà Django managers có thể được sử dụng trong bài viết này, và cách chúng giúp giữ một số logic kinh doanh và các truy vấn tái sử dụng. Trong bài viết tiếp theo, chúng ta sẽ khám phá querysets trong Django và cách chúng được sử dụng cùng với điều này.

Các Thực hành tốt nhất khi sử dụng Django Managers

  • Sử dụng Custom Managers cho Logic Tái sử dụng: Nếu bạn có nhiều truy vấn giống nhau, hãy tạo custom managers để tránh lặp lại mã.
  • Đặt tên rõ ràng cho Managers: Sử dụng tên mô tả cho custom managers để dễ dàng hiểu mục đích sử dụng của chúng.
  • Kiểm tra hiệu suất: Tránh sử dụng quá nhiều filters có thể làm giảm hiệu suất truy vấn.

Những cạm bẫy thường gặp

  • Quên sử dụng manager mặc định: Đôi khi, người mới có thể quên rằng manager mặc định cần được giữ lại cho admin và migrations.
  • Không kiểm tra kết quả trả về: Luôn kiểm tra kết quả trả về từ các truy vấn để đảm bảo tính chính xác của dữ liệu.

Mẹo về hiệu suất

  • Sử dụng select_relatedprefetch_related: Để tối ưu hóa truy vấn, hãy sử dụng các phương thức này để giảm số lượng truy vấn đến cơ sở dữ liệu.
  • Tối ưu hóa bộ nhớ: Hạn chế việc tải tất cả các bản ghi nếu không cần thiết.

Câu hỏi thường gặp (FAQ)

  1. Django manager là gì?
    Django manager là một lớp cung cấp giao diện giữa mã và cơ sở dữ liệu, cho phép thực hiện các truy vấn.
  2. Tôi có thể tạo bao nhiêu managers cho một model?
    Bạn có thể tạo nhiều managers cho một model, nhưng chỉ có một manager mặc định.
  3. Làm thế nào để tối ưu hóa truy vấn với managers?
    Bạn có thể sử dụng các phương thức như select_relatedprefetch_related để tối ưu hóa truy vấn.

Kết luận

Trong bài viết này, chúng ta đã tìm hiểu về Django managers và cách chúng giúp ích cho việc quản lý dữ liệu trong ứng dụng Django của bạn. Hãy thử áp dụng những kiến thức này vào dự án của bạn và đừng ngần ngại chia sẻ trải nghiệm của mình với cộng đồng!

Tài nguyên bổ sung

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào