要在Django中过滤数据,请为多列构建动态查询

时间:2018-07-08 08:20:29

标签: python django django-views django-queryset django-filter

我必须根据运行时值从模型中过滤数据。我通过查询字符串得到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或查询字符串中的值

3 个答案:

答案 0 :(得分:0)

您可以使用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'))

答案 1 :(得分:0)

过滤非空值的请求,然后使用字典扩展进行查询。

q =  {k:v for k, v in request.GET.items() if v}
sum_tt_count = NetworkRelatedInformation.objects.filter(**q).aggregate(Sum('tt_count'))

答案 2 :(得分:0)

要处理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']