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

Posted

技术标签:

【中文标题】为了在 Django 中过滤数据,为多列构建动态查询【英文标题】:For filtering data in Django, build dynamic query for multiple columns 【发布时间】:2018-12-16 05:24:27 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

非常感谢!它很棒且通用,可用于查询字符串中的任意数量的值。 HI Daniel...你能看看我的另一个问题***.com/questions/51202612/…我尝试了多种使用过滤方法、@property 和 qs 的方法,但没有什么对我有用.. 请看看你是否可以支持在这个【参考方案3】:

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

【讨论】:

以上是关于为了在 Django 中过滤数据,为多列构建动态查询的主要内容,如果未能解决你的问题,请参考以下文章

Django在多列值的“元组”上过滤查询集

Django:为相关表构建动态 Q 查询

在 Django 中使用继承过滤模型

JQuery MiNiUI 多选多列下拉列表如何动态赋值。

Vba 到基于多列的自动过滤器

如何在查询集中动态设置 Django 过滤器