Tôi thấy không có sự khác biệt trong phân lớp đối tượng models.manager
và ghi đè phương thức get_query_set
hoặc chỉ cần tạo phương thức mới trong lớp con và sử dụng phương thức. Vì lý do là tôi đã lấy ví dụ từ sách django;subclassing models.Manager
class MaleManager(models.Manager):
def get_query_set(self):
return super(MaleManager, self).get_query_set().filter(sex='M')
class FemaleManager(models.Manager):
def get_query_set(self):
return super(FemaleManager, self).get_query_set().filter(sex='F')
class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
sex = models.CharField(max_length=1, choices=(('M', 'Male'), ('F', 'Female')))
people = models.Manager()
men = MaleManager()
women = FemaleManager()
Với điều này tôi có thể sử dụng; Person.women.all()
hoặc Person.men.all()
để tìm nạp tất cả đối tượng người mẫu hoặc phụ nữ. Nhưng, tôi đoán điều tương tự có thể đạt được mà không cần ghi đè phương thức get_query_set
đơn giản bằng cách thực hiện;
class MaleManager(models.Manager):
def get_male(self):
return self.filter(sex='M')
class FemaleManager(models.Manager):
def get_female(self):
return return self.filter(sex='F')
class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
sex = models.CharField(max_length=1, choices=(('M', 'Male'), ('F', 'Female')))
people = models.Manager()
men = MaleManager()
women = FemaleManager()
Bây giờ, với điều này, tôi có thể tìm nạp tất cả các đối tượng đó bằng một ít kỹ thuật như; Person.objects.get_male()
hoặc Person.objects.get_female()
. Tuy nhiên, không có bất kỳ sự khác biệt tinh tế nào giữa cách tôi có thể tìm nạp các đối tượng nhưng có sự khác biệt về khả năng đọc và sử dụng trong trường hợp đầu tiên trong khi trường hợp thứ hai dễ hiểu hơn và có mã ít hơn. mẫu? Một điều khác với cái thứ hai, nếu tôi đặt cả hai phương thức trong cùng một lớp như thế nào;
class PeopleManager(models.Manager):
def get_male(self):
return self.filter(sex='M')
def get_female(self):
return return self.filter(sex='F')
Nếu tất cả những gì bạn có là 2 phương pháp, tổ chức có được một người quản lý hoàn toàn riêng biệt không đáng phải lo lắng - không chắc chắn lý do tại sao sách django đề xuất Nữ quản lý và MaleManager như trái ngược với phương thức get_females và get_males trên một người quản lý. –
Nó phụ thuộc nhiều hơn vào lớp trừu tượng của bạn. Nếu bạn có kế hoạch để có 'PeopleManager' mà chỉ tách người theo giới tính thứ hai tùy chọn hữu ích hơn. Nếu trong tương lai, ví dụ 'FemaleManager' sẽ có các phương thức như' get_blondes() 'hoặc' get_married() 'thì cách tiếp cận thứ hai phù hợp hơn. –