2011-02-08 93 views
6

我試圖創建一個自定義函數,我可以將其放置在將應用過濾器到查詢集的查詢集「鏈」中。與普通的Django查詢集過濾器一樣,它將把查詢集置於其左側,並將生成的查詢集傳遞給右側。Django模型查詢集過濾器作爲函數

然後加入我的自定義功能的查詢集鏈:

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') 

加入我的自定義功能的查詢集鏈後:

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') 

我不知道如何構建我的功能做這個。它周圍是否需要某種裝飾器?

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

有沒有人知道一個很好的方法來實現這個目標?

以下方法可能有效,但我希望能有更多像Django一樣的東西。

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

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

任何意見是非常感謝。

謝謝, 喬

更新:我試圖找出伊格納西奧的解決方案的詳細信息。我沒有與查詢集壓倒一切,所以我拼湊什麼,我能找到做太多...

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) 

不過,我不認爲這是工作,我期望的方式。有什麼建議麼?

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

UPDATE 2: 本文證明是有用的。 http://zmsmith.com/2010/04/using-custom-django-querysets/

+0

+1爲更新2中的鏈接,也幫助我。 – 2012-02-13 18:09:25

回答

4

您將需要編寫自己的QuerySet子類添加方法,然後use that class in the manager

+0

感謝您的建議Ignacio。我已經在上面做了更新。 – 2011-02-08 23:35:10