簡體   English   中英

要在Django中過濾數據,請為多列構建動態查詢

[英]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.

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