Фильтр djang orm со столбцом собственной даты - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть вопрос.

моя модель похожа на ниже.

depart_date = models.DateField(null=True, blank=True, verbose_name=_("Depart Date"))
days = models.IntegerField(default=0, null=True, blank=True, verbose_name=_("Day"))

и я хочу отфильтровать мои данные используя orm query?

это так просто, когда я использую необработанный запрос ниже (когда я использую oracle)

SELECT * FROM MY_TABLE = WHERE depart_date + days >= > TO_DATE('2020-01-01', 'YYYY-MM-DD')

, чем вы за вашу помощь

Ответы [ 4 ]

1 голос
/ 11 февраля 2020

Вы можете попытать счастья с F объектом и упаковщиком выражений :

from django.utils import timezone
from django.db.models import DateTimeField, ExpressionWrapper, F

YourModel.objects.annotate(days_delta=ExpressionWrapper(timezone.timedelta(seconds=1) * F("days"), output_field=DateTimeField()).annotate(final_date=ExpressionWrapper(F('depart_date') + F('days_delta'), output_field=DateTimeField())).filter(final_date__gte=timezone.now())

Также вам может понадобиться использовать значение обернуть часть выражения timedelta.

Примечание: это может не работать на некоторых механизмах БД.

0 голосов
/ 12 февраля 2020

благодаря charnel.

Я пытаюсь использовать ваш код, но произошла ошибка

, поэтому я редактирую ваш пример кода следующим образом

model.objects.annotate(
        arrive_date=ExpressionWrapper(F('depart_date') + timedelta(days=1) * (F('day')),
                                      output_field=DateTimeField())).filter(arrive_date__gte={date})
0 голосов
/ 11 февраля 2020
aim_date = depart_date - datetime.timedelta(days=7)


# if you want to get datas which earler than 7 days ago,maybe you can try this
obj_list=Customer.objects.filter(depart_date__lte=aim_date)

надежда может помочь вам!

0 голосов
/ 11 февраля 2020

Вы можете сделать это с помощью дополнительного шага, используя .annotate(). Например, грубая идея:

return (YourModel
       .objects
       .annotate(full_date=F("depart_date") + F("days"))
       .fitler(full_date__gte=timezone.now())
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...