2017-10-19 113 views
2

我想創建一個返回過濾器結果的類函數,但我希望能夠像使用django過濾器一樣使用它:如何將Django過濾器參數作爲參數傳遞給其他函數

這是我已經試過:

def section_set_with_compound(self, *args, **kwargs): 
    print args 
    print kwargs 
    return self.section_set.filter(Q(args) |Q(course__is_compound=True)) 

但是我得到一個錯誤,就像指定參數和kwags都是空的:

我希望能夠做到:

myobject.section_set_with_compound(param1=1,param2__param3__=x,param4__icontains="ha..") 

我該如何做到這一點?

+0

使用:'Q(** kwargs)' – schwobaseggl

+0

但是你不在過濾器中使用'kwargs'。 –

回答

1

您需要在呼叫使用星號和雙星號(*)到Q還有:

def section_set_with_compound(self, *args, **kwargs): 
    return self.section_set.filter(Q(*args, **kwargs) | Q(course__is_compound=True))

args元組無名參數,kwargs是字典用命名爲參數。但是,如果您想要再次將這些參數作爲未命名參數和命名參數傳遞,則還需要使用星號進行呼叫。

請注意,在這裏,你已經建立了一個邏輯或,這意味着要素應該滿足篩選與你,工作參數的course__is_compoundTrue(或兩者同時) 。

如果你想有一個邏輯與,你可以使用:

def section_set_with_compound(self, *args, **kwargs): 
    return self.section_set.filter(*args, course__is_compound=True, **kwargs)

現在Django會過濾行,這樣,所有的條件,你進入保持狀態,course__is_compound設置爲True。與第一個代碼片段相比,這是語義上不同的

相關問題