簡體   English   中英

基於可選參數的Django過濾

[英]Django filtering based on optional parameters

我有一個可選參數列表,我用於在Django中過濾,並嘗試提出應用這些過濾器的最佳解決方案。 我的第一個想法是做一些像:

if param_1 != 'all' and param_2 != 'all': # etc.
    class_var = ClassName.objects.filter(param_1__name=param_1, param_2__name=param_2) # etc.
else:
    class_var = ClassName.objects.all()

但由於參數都是可選的,我可能只想根據param_1進行過濾, param_1其余部分設置為'all' 當然另一種選擇是說:

class_var = ClassNam.objects.all()
if param_1 != 'all':
    class_var.filter(param_1__name=param_1)

if param_2 != 'all':
    class_var.filter(param_2__name=param_2)

# etc.

但在我看來,這似乎並沒有真正有效。 我只是希望得到一些關於我可能能夠執行這些選項過濾器的方法的想法。

你實際上可以做什么

from django.db.models import Q

q = Q()
if param_1 != 'all':
    q &= Q(param_1__name=param_1)

if param_2 != 'all':
    q &= Q(param_2__name=param_2)

class_var = ClassName.objects.filter(q)

OR

q = {}
if param_1 != 'all':
    q.update({'param_1__name': param_1})

if param_2 != 'all':
    q.update({'param_2__name': param_2})

class_var = ClassName.objects.filter(**q)

您可能想要查看Q對象 簡而言之, Q允許您在查詢中使用OR語句。 從上面的鏈接頁面:

Polls.objects.get(
    Q(question__startswith='Who') | Q(question__startswith='What')
)

這將引發以“Who”或“What”開頭的問題。

使用Q對象制作查詢列表。

q=[]
if param_1 != 'all':
   q.append(Q(param_1__name=param_1))
if param_2 != 'all':
   q.append(Q(param_2__name=param_2))

details = ClassName.objects.filter(reduce(AND, q))

查詢集很懶惰。 在評估查詢集之前,通常不會通過迭代來進行數據庫查詢。 您可以免費使用任意數量的過濾器。

一個注意事項: filter()不會更改查詢集,而是返回一個新的查詢集。 應用其他過濾器的正確方法是:

class_var = class_var.filter(param_1__name=param_1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM