Колба DateTime не будет установлена с datetime по умолчанию.utcnow


Я новичок в SQLAlchemy и не смог установить дату и время для created. Я пробовал использовать опцию "default", найденную во многих примерах. Я также попытался установить его вручную (я его прокомментировал). Ни то, ни другое до сих пор не сработало. Любая помощь будет оценена по достоинству.

models.py

import datetime
from flask.ext.sqlalchemy import SQLAlchemy
from werkzeug import generate_password_hash, check_password_hash

db = SQLAlchemy()

class User(db.Model):

  __tablename__    = 'users'
  uid              = db.Column(db.Integer, primary_key=True)
  firstname        = db.Column(db.String(40))
  lastname         = db.Column(db.String(40))
  email            = db.Column(db.String(120), unique=True)
  created          = db.Column(db.DateTime, default=datetime.datetime.utcnow())
  confirmed        = db.Column(db.DateTime, nullable=True)
  pwdhash          = db.Column(db.String(100))

  def __init__(self, firstname, lastname, email, password):
    self.firstname = firstname.title()
    self.lastname  = lastname.title()
    self.email     = email.lower()
    self.set_password(password)
    #self.created   = datetime.datetime.utcnow()
    self.confirmed = None

  def set_password(self, password):
    self.pwdhash   = generate_password_hash(password)

  def check_password(self, password):
    return check_password_hash(self.pwdhash, password)

routes.py

from tasks import app
from datetime import datetime
from flask import render_template, request, flash, session, url_for, redirect
from forms import ContactForm, SignupForm, SigninForm
from flask.ext.mail import Message, Mail
from models import db, User, Tags, Tasks

@app.route('/signup', methods=['GET', 'POST'])
def signup():
  form = SignupForm()

  if 'email' in session:
    return redirect(url_for('profile')) 

  if request.method == 'POST':
    if form.validate() == False:
      return render_template('signup.html', form=form)
    else:
      newuser = User(form.firstname.data, form.lastname.data, form.email.data, form.password.data)
      db.session.add(newuser)
      db.session.commit()

      session['email'] = newuser.email
      return redirect(url_for('profile'))

  elif request.method == 'GET':
    return render_template('signup.html', form=form)
2 6

2 ответа:

Проблема с вашим default заключается в том, что вы вызываете datetime.utcnow сразу же, и возвращаемое значение (во время определения класса) всегда используется по умолчанию. Вам нужно передать сам вызываемый объект следующим образом:

# Note the lack of parenthesis after datetime.utcnow
created = db.Column(db.DateTime, default=datetime.datetime.utcnow)

Таким образом SQLAlchemy вызовет datetime.utcnow себя при вставке строки.

Это также хорошее решение:

  created = db.Column(db.DateTime, server_default=db.func.now())
  updated = db.Column(db.DateTime, server_default=db.func.now(), server_onupdate=db.func.now())