如何在Django orm上进行多重过滤?

时间:2018-10-15 07:04:35

标签: django django-models django-orm django-filters

我有一个带有字段的表:

No. | name  | utc_date | utc_time  |
------------------------------------
1   | John  | 181014   | 140104.12 |
2   | Mark  | 181014   | 152312.01 |
3   | Kim   | 181015   | 092345.23 |
4   | Jane  | 181015   | 234543.32 |

如何创建像这样的Django ORM查询??

(utc_date >= 181014, utc_time >=150000.00) AND (utc_date <= 181015, utc_time <= 150000.00 )

*我尝试制作如下所示的图片,但这不起作用

MyTable.objects.filter(utc_date__gte=181014, 
                       utc_date__lte=181015, 
                       utc_time__gte=150000.00, 
                       utc_time__lte=150000.00)

3 个答案:

答案 0 :(得分:0)

对于多个过滤器,请使用Q objects

您的情况应该看起来像

from django.db.models import Q

MyTable.objects.filter(Q(utc_date__gte=181014) & 
                       Q(utc_date__lte=181015) & 
                       Q(utc_time__gte=150000.00) &
                       Q(utc_time__lte=150000.00))

答案 1 :(得分:0)

我想您将datetime与datefield和timefield分开,名称分别为utc_date和utc_time,您希望过滤日期时间范围内的数据,就像这样:

# first get data in date range:
data = MyTable.objects.filter(utc_date__gte=181014, utc_date__lte=181015)
# second exclude other
data1 = data.exclude(utc_date=181014, utc_time__lt=150000.00)
data2 = data1.exclude(utc_date=181015, utc_time__gt=150000.00)

data2是您所需要的。

主要思想是,如果我想获取2018-10-14 15:002018-10-15 15:00中的数据,我获取2018-10-14 00:002018-10-15 24:00中的所有数据,然后删除{{1}中的数据}〜2018-10-14 00:002018-10-14 15:002018-10-15 15:00

答案 2 :(得分:0)

您的解决方案无法正常工作,因为在NPE中添加多个条件只会将所有条件与在一起。

我认为解决此问题的最简单,最易读的方法是单独查看每个日期。我们将使用Q objects启用逻辑OR:

.filter()