2013-10-29 47 views
0

我想能如果可能的話,通過objects通過ARGS或kwargs,沒有不必要的併發症。它看起來像Model.objects('something').all()Model.objects('something').order_by('field')。我試圖爲AManager自定義__init__,但無法使其正常工作,所以它可能與編寫適當的__init__函數一樣簡單。Django的定製model.Manager所以它接受參數

我所做的是一個方法添加到自定義管理器,它看起來是這樣的:

class AManager(models.Manager): 
    def example(self, arg): 
     self.example = arg 
     return self 

class A(models.Model): 
    name = models.Charfield() 

    objects = AManager() 

在這個例子中,A.objects.example('name').all()將返回通常A.objects.all(),當然,除非example('name')影響查詢集莫名其妙。我想要做的是避免像A.objects.custom_filter('name').another_filter('name')這樣的事情,我必須爲每個鏈式過濾器包含一個重複的參數。

回答

1

你需要一個__call__方法添加到您的管理器,它接受這種說法,並返回一個不同的查詢設置,則默認管理器(或基於該參數的經理)。

你最好編寫自定義查詢集方法,並將其送回。查詢集旨在進行鏈接,因此您不必繼續傳遞相同的參數。

如果你把你的具體使用情況下,我可以告訴你如何使用自定義管理器和/或查詢集類它來構造。

+0

我的一些查詢調用模型屬性,這對於獲取和計算都很昂貴。它們在調用自定義QuerySet方法時發生。我現在保存計算的值(作爲DataList實例)。我想調用保存的值(如果它們存在或使用QuerySet),並傳遞一些初始值使其更容易。然後,我可以將相同的方法對QuerySet和DataList進行鏈接,因此查詢清晰可辨並且讀取的內容相同。但是,在Django查詢過於昂貴的情況下,操作會切換到針對Python類的方法。那麼我如何定製'__call__'方法呢? – Cole

+0

沒有更具體的代碼示例,我很難給你指示如何構建通過鏈接保留狀態的自定義QuerySets。退房Django的模型utils的具有能夠解決定製的QuerySet方法鏈接一個PassthroughManager:實際上我用https://django-model-utils.readthedocs.org/en/latest/managers.html#passthroughmanager –

+0

'PassThroughManager '頻繁:) – Cole

相關問題