Как сделать мульти фильтр на Django Orm? - PullRequest
0 голосов
/ 15 октября 2018

У меня есть таблица с полями:

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 голосов
/ 15 октября 2018

Я полагаю, у вас есть разделение даты и времени на поле даты и поле времени с именами 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:00 и 2018-10-15 15:00~ 2018-10-15 24:00

0 голосов
/ 17 октября 2018

Ваше решение не работает, потому что добавление нескольких критериев в .filter() просто объединяет их все.

Я думаю, что самый простой и читаемый способ решить эту проблему - посмотреть каждую дату в отдельности.Мы будем использовать Q объектов для включения логических ИЛИ:

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))
0 голосов
/ 15 октября 2018

Для нескольких фильтров используйте Q объекты .

В вашем случае это должно выглядеть как

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))
...