2011-02-08 54 views
6

Tôi đang cố tạo một hàm tùy chỉnh mà tôi có thể đặt trong một chuỗi truy vấn "chuỗi" sẽ áp dụng bộ lọc cho bộ truy vấn. Giống như với bộ lọc truy vấn bình thường Django, nó sẽ lấy queryset ở bên trái của nó và chuyển queryset kết quả sang bên phải.Bộ lọc truy vấn mô hình Django là một hàm

Trước khi thêm chức năng tùy chỉnh của tôi vào chuỗi queryset:

models.MyModel.objects.all() 
models.MyModel.objects.some_manger_function() 
models.MyModel.objects.some_manger_function().count() 
models.MyModel.objects.some_manger_function().filter(title='something') 

Sau khi thêm chức năng tùy chỉnh của tôi vào chuỗi queryset:

models.MyModel.objects.all().my_custom_filter() 
models.MyModel.objects.some_manger_function().my_custom_filter() 
models.MyModel.objects.some_manger_function().my_custom_filter().count() 
models.MyModel.objects.some_manger_function().my_custom_filter()\ 
    .filter(title='something') 

Tôi không chắc chắn làm thế nào để xây dựng chức năng của tôi để làm điều này. Liệu nó cần một số loại trang trí xung quanh nó?

???? def my_custom_filter(???): 
???? return qs.filter(id__gte=10) 

Có ai biết cách tốt để thực hiện việc này không?

Sau đây có thể làm việc, nhưng tôi đã hy vọng cho một cái gì đó nhiều hơn một chút giống Django.

def my_custom_filter(qs): 
    return qs.filter(id__gte=1) 

my_custom_filter(models.MyModel.objects.all()).count() 

Mọi lời khuyên đều được đánh giá cao.

Cảm ơn, Joe

CẬP NHẬT: Tôi đang cố gắng để làm việc ra các chi tiết về giải pháp Ignacio của. Tôi đã không làm quá nhiều với QuerySet ghi đè vì vậy tôi đang ghép nối với nhau những gì tôi có thể tìm thấy ...

class MyQuerySet(QuerySet): 

    def filter(self, *args, **kwargs): 
     return super(self.__class__, self).filter(*args, **kwargs).\ 
        filter(id__gt=5) 


class MyManager(models.Manager): 

    def testqs(self): 
     return MyQuerySet(self.model) 

Tuy nhiên, tôi không nghĩ rằng điều này là làm việc theo cách tôi mong đợi. Bất kỳ đề xuất?

>>> models.MyModel.objects.testqs().filter() 

UPDATE 2: Bài viết này được chứng minh là hữu ích. http://zmsmith.com/2010/04/using-custom-django-querysets/

+0

+1 cho liên kết trong bản cập nhật2, đã giúp tôi. –

Trả lời

4

Bạn sẽ cần viết QuerySet lớp con của riêng mình với phương thức được thêm, sau đó use that class in the manager.

+0

Cảm ơn lời khuyên của bạn Ignacio. Tôi đã cập nhật ở trên. –

Các vấn đề liên quan