Фильтр по 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.

Вернуться на верх