SQLAlchemy Default DateTime, теперь плюс n дней - PullRequest
0 голосов
/ 02 сентября 2018

Я хочу иметь столбец с типом DateTime со значением по умолчанию 30 дней с этого момента

Я не могу установить значение по умолчанию сейчас, используя default=datetime.datetime.utcnow, но когда я пытаюсь использовать что-то вроде default=(datetime.datetime.utcnow + datetime.timedelta(days=30))

Возвращается и ошибка TypeError: unsupported operand type(s) for +: 'builtin_function_or_method' and 'datetime.timedelta'

Лучший пример моего кода:

class Example(Base):
    id = Column(Integer, primary_key=True)
    name = Column(String, nullable=False, unique=True)
    date = Column(DateTime, default=(datetime.datetime.utcnow + datetime.timedelta(days=30)))

Как я могу сделать это без жесткого кодирования?

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Похоже, что решением этой проблемы является не установка по умолчанию или установка datetime.datetime.utcnow по умолчанию, а затем присвоение его значения по умолчанию для класса __init__ method

class Example(Base):
    __tablename__ = 'example'
    id = Column(Integer, primary_key=True)
    name = Column(String, nullable=False, unique=True)
    date = Column(DateTime)

    def __init__(self, name, date=None):
        self.name = name
        self.date = date if date else datetime.datetime.utcnow() + datetime.timedelta(days=30)

Это единственный способ, который работает

Никогда не используйте:

date = Column(DateTime, default=(datetime.datetime.utcnow() + datetime.timedelta(days=30)))

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

0 голосов
/ 02 сентября 2018

Хорошо, когда datetime.datetime.utcnow - это функция, которую вы можете использовать datetime.datetime.utcnow() как datetime.datetime class



дата = столбец (DateTime, по умолчанию = (datetime.datetime.utcnow () + datetime.timedelta (days = 30)))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...