Фильтр по CharField, делая вид, что это DateField в Django ORM/mySql
Я работаю с уже готовой базой данных mySQL, используя Django ORM, и мне нужно отфильтровать строки по дате - если бы не то, что даты не в типе Date, а обычные Varchar(20), хранящиеся как dd/mm/yyy hh:mm(:ss). С помощью свободного запроса я бы преобразовал поле в дату и использовал операторы > и < для фильтрации результатов, но прежде чем сделать это, я хотел бы узнать, предоставляет ли Django ORM более элегантный способ сделать это без написания сырых SQL запросов.
Жду любых предложений.
EDIT: мой необработанный запрос будет выглядеть как
SELECT * FROM table WHERE STR_TO_DATE(mydate,'%d/%m/%Y %H:%i') > STR_TO_DATE('30/12/2020 00:00', '%d/%m/%Y %H:%i')
Спасибо.
Я предположу, что ваша модель выглядит следующим образом:
from django.db import models
class Event(models.Model):
mydate = models.CharField(max_length=20)
def __str__(self):
return f'Event at {self.mydate}'
Для представления этого вычисления можно построить выражение запроса Django query expression. Это выражение состоит из:
Funcобъекты, представляющие вашиSTR_TO_DATEвызовы функций.- Объект
F, представляющий имя вашего поля. - Функция
GreaterThanдля представления вашего>сравнения.
from django.db.models import F, Func, Value
from django.db.models.lookups import GreaterThan
from .models import Event
class STR_TO_DATE(Func):
function = 'STR_TO_DATE'
events = Event.objects.filter(GreaterThan(
STR_TO_DATE(F('mydate'), Value('%d/%m/%Y %H:%i')),
STR_TO_DATE(Value('30/12/2020 00:00'), Value('%d/%m/%Y %H:%i'))))
Я протестировал этот ответ с Django 4.0.1 и MySQL 8.0.