Использование аннотаций Django с F-полями для сериализации свойств - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть следующее свойство модели:

@property
def is_complete(self):
  return datetime.datetime.now() >= datetime.datetime.combine(self.date, self.ending_time)

Мне было интересно, как я могу преобразовать это в аннотацию, такую, что:

MyObject.objects.annotate(is_complete=?).filter(is_complete=True)

будет эквивалентным и действительным?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Вы можете использовать ExpressionWrapper, чтобы объединить дату и время, преобразовать результат в фактический объект datetime Python и, наконец, вы можете сделать сравнение.

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

MyCustomObject.objects.annotate(combine_datetime=ExpressionWrapper(F('date') + F('ending_time'), output_field=DateTimeField())).filter(combine_datetime__lte=timezone.now())

Документы: Django 2.2 Выражение запросаФ с аннотацией

0 голосов
/ 05 ноября 2019

Попробуйте это:

from django.db.models.expressions import Value
from django.db.models.functions.datetime import TruncDate

MyObject.objects.annotate(is_complete=Value(datetime.datetime.now() >= datetime.datetime.combine(TruncDate('date'),TruncDate('ending_time'))))).filter(is_complete=True)
...