2017-07-19 136 views
0

所以基本上我有這個從ListView繼承的通用視圖,我想要它採取某種形式的參數(如字符串或「選項」),然後根據這些篩選我的模型參數。Django通用視圖模型篩選

我已經找了兩天,似乎無法找到很多關於此。我已經覆蓋get_queryset功能玩耍了也只是試圖過濾直接像這樣:

model = product.objects.filter(pk__in=[1,2,3,4,5]) 

但是大多數時候它只是給我這個錯誤:

/python3.5/site-packages/django/views/generic/list.py", line 38, in get_queryset 

    queryset = self.model._default_manager.all() 
AttributeError: 'QuerySet' object has no attribute '_default_manager' 

我真的不需要一個「解決方案」我會很好,如果有人只是可以指向我在哪裏我可以閱讀有關這方面的事情,因爲我只能設法找到基本的描述。

感謝

+1

可以添加你的車型更多的細節? –

+3

什麼是產品?這是模型或變量名稱的名稱。看來產品是變量名(分配給查詢集),在這種情況下,它應該是product.filter(pk__in = [1,2,3,4,5]) –

+0

產品是模型的名稱「from」。模型導入產品「 – Bolian

回答

1

嘗試,

class YourView(ListView): 
    model = product 

    def get_queryset(self): 
     queryset = super(YourView, self).get_queryset() 
     #your condition here. 
     return queryset.filter(pk__in=[1,2,3]) 
+0

我現在這樣做了:def get_queryset(self,** kwargs): return product.objects.filter(** kwargs) model = product並且它似乎工作,是否真的對super只是curius)?另外我怎麼發送kwargs到一個視圖?像搜索字符串的參數,還是隻使用post方法更好?謝謝你的幫助! (編輯:標識在這個評論中搞砸了,哦,好吧......) – Bolian

+0

'super()'調用只是加載默認的queryset。僅僅調用父類方法只是傳統的,你可以忽略它,但它實際上是一個很好的習慣。然後,關於通過kwargs,你可以寫你的網址來抓住一個特定的模式,並用它作爲kwarg,儘管這很醜陋。但是,我個人建議編寫一個用於過濾查詢集的自定義管理器(僅當需要根據某些傳遞的kwarg進行過濾時)。 – zaidfazil

+0

那麼基本上我試圖做一個商店,用戶有能力輸入搜索字符串或檢查不同的類別。如果這是PHP我想我會發布一切,然後只檢查值沒有沒有然後建立一個查詢。我決定涉足kwargs,因爲我認爲它更容易+我在文檔中看到這個「過濾器(** kwargs)。我有點想使它像一個unix命令,其中」ls「是視圖和」 - 「(破折號)是選項還是在這種情況下過濾,但我不知道這是他們如何實現它的......我可能只需要做一個帖子或檢查自定義管理器就好。 – Bolian

1

只需將它分成兩行:

model = Product 

queryset = Product.objects.filter(pk__in=[1,2,3,4,5]) 

它將工作。

+0

檢查您的模型類,它是'product'還是'Product'並且以該名稱命名。按照慣例,我們使用'CamelCase'作爲課程。 –