Python / Django: фильтрация объектов по Concat () и упорядочение по одной и той же конкатенации - PullRequest
0 голосов
/ 24 марта 2020

В моем проекте API Python / Django мне нужно получить набор запросов из модели, отфильтрованной по объединенной комбинации двух полей и упорядоченной по одной и той же связи. Однако я знаю, что нужно фильтровать только по одному полю, как показано ниже.

Требование: TimeTable имеет два поля «дата» и «время». Мне нужно перечислить данные, где комбинация обоих этих полей больше, чем текущая дата.

Код:

current_time = datetime.now()

timetable = TimeTable.objects.filter(user=user_id, date__gte=current_time.date()).order_by(Concat('date','time'))

MySQL эквивалент сценария:

SELECT * FROM time_table where concat(date,' ',time)>='2020-03-24 12:00:00' and user=user_id order by concat(date,' ',time) ASC

Как я могу выполнить sh это?

1 Ответ

1 голос
/ 01 апреля 2020

Просто укажите несколько полей в функции order_by(...) как,

TimeTable.objects.filter(date__gte='2020-04-02')<b>.order_by('date','time')</b>

Примечание: Вам не нужно объединить эти значения (в вашем случае).


Обновление

from django.db.models.functions import Concat, Cast
from django.db.models import DateTimeField, CharField, Value
from datetime import datetime

<b>date_time_expr = Cast(Concat('date', Value(' '), 'time', output_field=CharField()), output_field=DateTimeField())</b>

TimeTable.objects.annotate(<b>date_time=date_time_expr</b>).filter(<b>date_time__gte=datetime.now()).order_by('date_time')</b>
...