postgresql Django ORM -参数为空时WHERE的SQL部分

b5lpy0ml  于 2023-03-01  发布在  PostgreSQL
关注(0)|答案(2)|浏览(115)

我在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))

有什么想法吗?

rnmwe5a2

rnmwe5a21#

您可以尝试以增量方式构建查询集。例如:

queryset = MyModel.objects.all()

if severity is not None:
    queryset = queryset.filter(severity=severity)

if source is not None:
    queryset = queryset.filter(source=source)

if start is not None and end is not None:
    queryset = queryset.filter(date__range=(start, end))
rqmkfv5c

rqmkfv5c2#

queryset = MyModel.objects.filter(Q(severity=severity) | Q(severity__isnull=True), date__range=(start, end))

__isnull用于检查NULL数据。

此外,MYSQL 'AND'也不需要使用&,因为过滤器检查默认使用'AND'

相关问题