【问题标题】:sqlalchemy doesn't seem to like __getattr__()sqlalchemy 似乎不喜欢 __getattr__()
【发布时间】:2015-09-01 14:51:47
【问题描述】:

在我的基于 sqlalchemy 的烧瓶应用中,我有一个这样的模型:

class Foo(object):
    start_date = db.Column(db.DateTime())

它工作正常,但是当我使用模板引擎通过 {{ foo.start_date }} 将日期打印到 HTML 页面上时,它会打印出像 2015-8-8 00:00:00 这样的丑陋行。在尝试提出自己的格式时,我想到了一些聪明的方法(至少在我遇到问题之前)

class Foo(object):
    start_date = db.Column(db.DateTime())
    def __getattr__(self, name):
         return "{0}-{1}-{2}".format(self.start_date.year....)

但是,SQLAlchemy 内部的某些东西不喜欢这样。创建新对象时,会引发以下异常:

  File "<string>", line 6, in __init__
  File "/home/wenliang/work/template/flask/local/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.py", line 526, in _declarative_constructor
    setattr(self, k, kwargs[k])
  File "/home/wenliang/work/template/flask/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 226, in __set__
    instance_dict(instance), value, None)
  File "/home/wenliang/work/template/flask/local/lib/python2.7/site-packages/sqlalchemy/orm/attributes.py", line 694, in set
    state._modified_event(dict_, self, old)
AttributeError: 'NoneType' object has no attribute '_modified_event'

有人见过这个吗?

【问题讨论】:

    标签: python flask sqlalchemy


    【解决方案1】:

    SQLAlchemy 在内部使用__getattr__。如果你超载它,整个炼金魔法将不再起作用。

    您正在访问的字段是一个DateTime 对象。如果您想以任何其他方式将其格式化为字符串作为默认呈现,您应该使用strftime()

    https://stackoverflow.com/a/4830620/3929826 举了一个例子。 https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior 在格式字符串上有文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      相关资源
      最近更新 更多