我試圖創建一個自定義函數,我可以將其放置在將應用過濾器到查詢集的查詢集「鏈」中。與普通的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/
+1爲更新2中的鏈接,也幫助我。 – 2012-02-13 18:09:25