2016-11-14 137 views
0

說,我有以下兩種Django模型:上查詢集結合使用多種過濾器和Django過濾

class Author(models.Model): 
    name = models.CharField(max_length=100) 

class Book(models.Model): 
    name = models.CharField(max_length=300) 
    pages = models.IntegerField() 
    author = models.ForeignKey(Author) 

隨着django-filter,我怎麼能寫一個FilterSet,可以讓我來過濾有點像:

Author.objects.filter(
    (Q(book__name__contains='How') & Q(book__pages=100)) | 
    (Q(book__name__contains='Why') & Q(book__pages=50)) 
) 

也就是說,我想要一組過濾器字段,這些過濾器字段都應用於相關模型並可以合併。在我的情況下,該集包含更多的字段,所以自定義MultiValueField可能不是真的適用。

是否有任何標準的方式來解決這個使用django-filter,或者我應該在視圖中實現我自己的過濾邏輯?

+0

會是什麼請求查詢字符串看起來像這裏?你如何區分你想過濾的兩組'Q'對象? – Sherpa

+0

'?book_name_1 = How&book_pages_2 = 100&book_name_2 = why&book_pages_2 = 50' – janoliver

回答

1

如果你想保留這個在FilterSet,而不是回到視圖,你最好的選擇是覆蓋qs屬性,並在那裏添加多值過濾邏輯。

(使用自定義method提供了驗證,但仍然只需要一個值的字段 - 所以你需要拉從parent別人無論如何 - 這樣,覆蓋qs顯得更加清晰。)

+0

我認爲是這樣,並決定在視圖中以標準django形式手動執行操作會更容易且更易讀。然而,你的答案仍然是'django-filter'的正確方法,所以我會接受它。 – janoliver

+0

是的,夠公平的。 Django Filter的範圍是「常見的過濾問題」 - 不常見的可能需要手動完成。 :-) –