Как отфильтровать datetime.utcnow () по специфике c date.today () в flask -sqlalchemy - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть Order Объект с полем created_on.

created_on = db.Column(db.DateTime, default=datetime.utcnow())

Теперь я пытался получить номер ордера, созданного за день, с помощью функции number_of_order_a_day:

@classmethod
def number_of_order_a_day(cls):
    return cls.query.filter(cls.created_on.like('%{}'.format(date.today()))).count()

Но функция возвращает 0.

Это мой OrderModel Класс:

import sqlite3
from datetime import datetime, date
from app import db



class OrderModel(db.Model):
    __tablename__ = "orders"

    id = db.Column(db.Integer, primary_key = True)
    order_number = db.Column(db.String(80))
    created_on = db.Column(db.DateTime, default=datetime.utcnow())


    def __init__(self, order_number, created_on):
        self.order_number = order_number
        self.created_on = created_on


    @classmethod
    def find_by_id(cls, id):
        return cls.query.filter_by(id = id).first() 

    @classmethod
    def find_by_order_number(cls, order_number):
        return cls.query.filter_by(order_number = order_number).first() 

    @classmethod
    def number_of_order_a_day(cls):
        return cls.query.filter(cls.created_on.like('{}'.format(date.today()))).count()


    def save_to_db(self):
        db.session.add(self)
        db.session.commit()

    def delete_from_db(self):
        db.session.delete(self)
        db.session.commit()

1 Ответ

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

Решение было похоже на следующий импорт func из sqlalchemy:

from sqlalchemy import func

Затем функция number_of_order_a_day

@classmethod
def number_of_order_a_day(cls):
    return cls.query.filter(func.DATE(cls.created_on) == datetime.utcnow().date()).all()

Вместо count() Я возвращаюсь все соответствующие заказы в виде списка по дате. Затем на странице ресурса заказа получаем number_of_order_a_day с помощью функции len() для списка:

number_of_order_a_day = len(OrderModel.number_of_order_a_day()) 

Я обнаружил, что count() немного медленный.

...