我在django中遇到了一个问题,如果参数为空,我会尝试排除或包含过滤器的一部分。
我的模型中有4个参数:开始日期、结束日期、重要级别和来源。
过滤器可以有一个或多个这样的参数。如果我传递其中的一个,其他的可能是None
,除非它们被定义。
我能够通过以下操作解决查询原始数据的问题WHERE (param IS NULL OR param=param)
在 Django 也一样
"""SELECT * FROM mymanagelogs_logs WHERE (%(severity)s IS NULL OR severity=%(severity)s) AND (%(source)s IS NULL OR source=%(source)s) AND (%(start_date)s IS NULL OR timestamp >= %(start_date)s) AND (%(end_date)s IS NULL OR timestamp <= %(end_date)s)""",
params={'severity': severity, 'source': source, 'start_date':start, 'end_date':end}
)
但我不能做同样的QuerySet:
objects.filter(Q(date__range=(start, end)) & (Q(severity=severity) | Q(severity=None))
有什么想法吗?
2条答案
按热度按时间rnmwe5a21#
您可以尝试以增量方式构建查询集。例如:
rqmkfv5c2#
__isnull用于检查NULL数据。
此外,MYSQL 'AND'也不需要使用&,因为过滤器检查默认使用'AND'。