【问题标题】:How to make multi filter on django orm?如何在 django orm 上制作多重过滤器?
【发布时间】:2018-10-15 07:04:34
【问题描述】:

我有一个包含字段的表格:

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)

【问题讨论】:

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


    【解决方案1】:

    对于多个过滤器,请使用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))
    

    【讨论】:

    • 我也尝试使用该方法进行查询。但是过滤器只在utc_time下生成。
    【解决方案2】:

    我猜你有分隔日期时间到日期字段和时间字段的名称是 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:00 ~ 2018-10-15 15:00 中获取数据,我在2018-10-14 00:00 ~ 2018-10-15 24:00 中获取所有数据,然后删除2018-10-14 00:00 ~ 2018-10-14 15:002018-10-15 15:00 中的数据~ 2018-10-15 24:00

    【讨论】:

      【解决方案3】:

      您的解决方案不起作用,因为在 .filter() 中添加多个条件只是将它们全部组合在一起。

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

      from django.db.models import Q
      
      MyTable.objects.filter(Q(utc_date=181014, utc_time__gte=150000.00) | 
                             Q(utc_date=181015, utc_time__lte=150000.00))
      

      【讨论】:

        猜你喜欢
        • 2021-10-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-26
        • 2020-02-16
        • 1970-01-01
        • 1970-01-01
        • 2021-09-13
        • 2020-12-13
        相关资源
        最近更新 更多