在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=
因此,我想在过滤器中包含所有或 none 值,以便它显示所需的结果。以下是我正在编写的过滤器查询:
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 object
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']
我必须根据 运行 时间值从模型中过滤数据。我通过查询字符串获得 5 个值。我的查询字符串如下所示:
http://127.0.0.1:8000/personal/search/?month=&year=&account=&deliveryManagedFrom=&marketmName=
因此,我想在过滤器中包含所有或 none 值,以便它显示所需的结果。以下是我正在编写的过滤器查询:
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 object
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']