[英]For filtering data in Django, build dynamic query for multiple columns
我必須根據運行時值從模型中過濾數據。 我通過查詢字符串得到5個值。 我的查詢字符串如下所示:
http://127.0.0.1:8000/personal/search/?month=&year=&account=&deliveryManagedFrom=&marketmName=
因此,我想在過濾器中包括所有值或不包括任何值,以便它顯示所需的結果。 以下是我正在編寫的過濾器查詢:
sum_tt_count = NetworkRelatedInformation.objects.filter(month=month, year=year, account_id=account, account__deliveryManagedFrom=deliveryManagedFrom, account__marketName=market).aggregate(Sum('tt_count'))
totalttcount = sum_tt_count['tt_count__sum']
如果已經提供了所有值,則它運行良好。
如果任何值為空白,則不應考慮該值並按照其他過濾條件顯示輸出。
請提出如何用5個數據輸入實現OR過濾器。 不必全部5個數據輸入都具有值。 因此該值可以為None或querystring中的值
您可以使用Q對象
from django.db.models import Q
NetworkRelatedInformation.objects.filter(Q(month__isnull=True) | Q(month=month), Q(year__isnull=True) | Q(year=year)).aggregate(Sum('tt_count'))
過濾請求中的非空值,然后使用字典擴展進行查詢。
q = {k:v for k, v in request.GET.items() if v}
sum_tt_count = NetworkRelatedInformation.objects.filter(**q).aggregate(Sum('tt_count'))
為了處理None值,我必須明確編寫以下代碼。
account = request.GET.get('account')
if account is '':
account = None
month = request.GET.get('month')
if month is '':
month = None
year = request.GET.get('year')
if year is '':
year = None
sum_alarm_count = NetworkRelatedInformation.objects.filter(Q(month=month) | Q(year=year) | Q(account_id=account)) \
.aggregate(Sum('alarm_count'))
totalalarmcount = sum_alarm_count['alarm_count__sum']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.