2016-06-13 64 views
-1

說如何使用過濾器來檢查,我有一個文本字段的模型:Django的,如果字符串字段包含在參數

class SomeModel 
    keyword=models.CharField(null=True, max_length=255) 

現在,我知道如何檢查的參數字符串(允許調用變量「查詢字符串」包含在現場關鍵字:

results = SomeModel.objects.filter(keyword_icontains=querystring).all() 

我在django docs

問題,我該如何過濾其字段值中包含的對象找到查詢字符串變量?

道歉,如果我的問題令人困惑...也許一個例子將澄清... 在Django文檔中,如果我的關鍵字字段包含,例如,'python-django',那麼,對於包含'django 」,我可以提取包含帶有

results=SomeModel.objects.filter(keyword_icontains=querystring).all() 
or results=SomeModel.objets.filter(keyword_icontains='django').all() 

該字段的對象,而是說,我想提取其關鍵字字段包含在查詢字符串的所有行/對象?例如,如果querystring包含「在Django中,我該如何創建一個過濾器」?那麼我希望結果包含所有其關鍵字字段的值爲'django','filter'等的對象...

+1

包含字段的Querystring?正如包含模型字段名的querystring的值一樣? –

+0

@RajeshYogeshwar,在查詢字符串的值中包含模型字段的值... – RVC

+0

您當前的示例不正確,除非'querystring'實際上是字符串'「querystring」''。然後SQL的等價物就是'SELECT ... WHERE關鍵字IKE'%querystring%''。可能的是,這對您的問題是什麼以及可能的答案造成混淆。 – Evert

回答

1

您必須將輸入拆分爲單詞(取決於您對「單詞」的定義) ,然後遍歷它們,連接各種結果查詢集(其中大多數可能爲空)。

要分割,你可以使用正則表達式,抓住所有的字母和撇號(但你會錯過一個智能引號,如果有人使用,作爲輸入,而不是標準的ASCII撇號):

words = re.split(r"[^A-Za-z']+", querystring) 

然後循環和過濾:

query = Q() # empty Q object 
for word in words: 
    # 'or' the queries together 
    query |= Q(keyword_icontains=word) 
results = SomeModel.objects.filter(query).all() 

上面的代碼是未經測試,我上心到「或」的查詢和一個空的Q()從this answer

根據您的下一個步驟(S),直接在每個循環步驟評估查詢,追加到results名單,可能會更好地爲您(使用例如itertools.chain,按照this answer)。