0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Tạo QuerySets Tùy Chỉnh trong Django: Viết Truy Vấn Sạch Hơn

Đăng vào 6 ngày trước

• 4 phút đọc

Tạo QuerySets Tùy Chỉnh trong Django: Viết Truy Vấn Sạch Hơn

Khi xây dựng ứng dụng Django, đặc biệt là khi ứng dụng mở rộng, bạn có thể gặp khó khăn khi phải sử dụng lại các truy vấn trong nhiều bước logic khác nhau. Việc lặp lại này có thể làm cho mã nguồn trở nên khó duy trì và gây ra một số nhầm lẫn.

Đây chính là lúc mà QuerySets phát huy tác dụng. QuerySets tùy chỉnh cho phép chúng ta viết mã nguồn sạch hơn, giữ lại một số logic kinh doanh gần gũi với các mô hình của bạn trong khi tránh được sự lặp lại.

QuerySet là gì?

QuerySet đơn giản là một tập hợp các truy vấn cơ sở dữ liệu trong Django, cho phép chúng ta thực hiện các truy vấn thông qua ORM của Django tới cơ sở dữ liệu. Mặc định, objects là Manager tích hợp sẵn của Django, nó trả về một QuerySet. Nhưng nếu bạn luôn cần truy vấn đó? Việc viết lại bộ lọc ở khắp nơi không tuân theo nguyên tắc DRY (Don’t Repeat Yourself).

python Copy
from blog.models import Post

# QuerySets Mặc Định
all_posts = Post.objects.all()
published_posts = Post.objects.filter(status="published")

Định Nghĩa QuerySet Tùy Chỉnh

Bây giờ, hãy đi vào khía cạnh lập trình. Làm thế nào để bạn định nghĩa một QuerySet tùy chỉnh? Chúng ta sử dụng các mô hình được nhập từ Django's DB và kế thừa từ QuerySet. Dưới đây là một ví dụ. Giả sử bạn có một mô hình Post và bạn muốn thực hiện một số truy vấn lặp lại.

python Copy
from django.db import models

class PostQuerySet(models.QuerySet):
    def published(self):
        return self.filter(status="published")

    def drafts(self):
        return self.filter(status="draft")

    def by_author(self, author):
        return self.filter(author=author)

Gắn Kết QuerySet với Mô Hình

Tiếp theo, chúng ta sẽ gắn kết QuerySet này với mô hình của mình.

python Copy
class Post(models.Model):
    STATUS_CHOICES = (
        ("draft", "Draft"),
        ("published", "Published"),
    )

    title = models.CharField(max_length=200)
    content = models.TextField()
    status = models.CharField(max_length=10, choices=STATUS_CHOICES)
    author = models.ForeignKey("auth.User", on_delete=models.CASCADE)

    # Gắn QuerySet tùy chỉnh
    objects = PostQuerySet.as_manager()

Thực Hiện Các Truy Vấn

Giờ đây, chúng ta có thể thực hiện các truy vấn như:

python Copy
# Tất cả các bài viết đã xuất bản
Post.objects.published()

# Tất cả các bản nháp của một tác giả cụ thể
Post.objects.drafts().by_author(user)

Chúng ta thậm chí có thể nối chúng lại với nhau:

python Copy
# Lấy các bài viết đã xuất bản của một tác giả cụ thể
Post.objects.published().by_author(user)

Khi nào sử dụng QuerySets và Managers

Theo cách nào đó, QuerySets và Managers có sự tương đồng và khác biệt. Làm thế nào để bạn biết khi nào nên sử dụng mỗi cái?

Sử dụng QuerySets Tùy Chỉnh khi:

  • Bạn muốn bộ lọc có thể tái sử dụng (như .published(), .active()).
  • Bạn cần các truy vấn có thể nối với nhau.

Sử dụng Managers Tùy Chỉnh khi:

  • Bạn muốn ghi đè phương thức get_queryset().
  • Bạn cần các truy vấn trả về điều gì đó ngoài một QuerySet (như tạo đối tượng hoặc tổng hợp).

Thực Hành Tốt Nhất với QuerySets Tùy Chỉnh

  • Giữ mã nguồn sạch: Sử dụng QuerySets tùy chỉnh để giảm thiểu sự lặp lại và giữ cho mã nguồn dễ đọc.
  • Tái sử dụng logic: Đặt logic kinh doanh vào các phương thức trong QuerySets để tái sử dụng dễ dàng hơn trong các phần khác của ứng dụng.
  • Tối ưu hóa hiệu suất: Sử dụng các phương thức lọc hợp lý để tối ưu hóa truy vấn cơ sở dữ liệu, tránh truy vấn không cần thiết.

Những cạm bẫy phổ biến

  • Quá nhiều logic trong QuerySets: Đừng nhồi nhét quá nhiều logic vào một QuerySet, điều này có thể làm cho mã nguồn trở nên khó hiểu.
  • Không sử dụng đúng cách: Hãy chắc chắn rằng bạn hiểu khi nào nên sử dụng QuerySets so với Managers để tránh nhầm lẫn.

Mẹo Tối Ưu Hiệu Suất

  • Sử dụng select_relatedprefetch_related: Khi làm việc với các mối quan hệ, 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.
  • Sử dụng phương thức only hoặc defer: Chỉ lấy những trường cần thiết để giảm tải cho cơ sở dữ liệu.

Khắc Phục Sự Cố

  • Truy vấn không trả về kết quả: Kiểm tra điều kiện lọc, đảm bảo rằng có dữ liệu phù hợp trong cơ sở dữ liệu.
  • Lỗi khi sử dụng phương thức: Đảm bảo rằng bạn đã định nghĩa đúng phương thức trong QuerySet.

Kết luận

Trong bài viết này, chúng ta đã khám phá cách mà QuerySets giúp chúng ta giữ được nguyên tắc DRY và viết mã nguồn sạch hơn. Trong bài tiếp theo, chúng ta sẽ xem xét cách kết hợp ba yếu tố mạnh mẽ trong models.py với chủ đề Phương Thức Mô Hình Tùy Chỉnh so với Managers so với QuerySets: Khi nào nên sử dụng từng loại.

Nếu bạn thấy bài viết này hữu ích, hãy chia sẻ với cộng đồng và theo dõi chúng tôi để không bỏ lỡ các bài viết tiếp theo!

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