我经常用Text
保存 Markdown 格式的富文本的列。我的模型看起来像这样:
class Document(Base):
id = Column(Integer, primary_key=True)
title = Column(Unicode(250))
description = Column(Text)
description_html = Column(Text)
我的编辑表单 (a) 读取和写入description
然后 (b) 将 Markdown 格式的版本写入description_html
。我的 (Jinja2) 视图模板 (c) 加载 HTML 版本{{ doc.description_html|safe }}
.
我想将这三个重复操作减少到一个列定义中,如下所示:
class Document(Base):
id = Column(Integer, primary_key=True)
title = Column(Unicode(250))
description = Column(MarkdownText)
Where MarkdownText
是一种新的列类型:
- 在数据库表中创建两列(description 和description_html),
- 在写入列时,还会将 Markdown 格式的版本写入 html 列,并且
- 提供了一个
__html__()
返回 html 列内容的方法。这将允许它从 Jinja2 模板中使用{{ doc.description }}
没有safe
filter.
问题:#1 可能吗?我可以定义一个列来生成两列吗?
我们开始 - 现在使用复合列:
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, Text
from sqlalchemy.orm import composite, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite:///')
session = sessionmaker(bind=engine)()
Base = declarative_base()
class MarkdownText(object):
def __init__(self, text):
self._text = text
self._html = "<html>%s</html>" % text
@classmethod
def _from_db(cls, text, html):
mt = MarkdownText(text)
mt._html = html
return mt
def __composite_values__(self):
return (self._text, self._html)
def __str__(self):
return self._text
@property
def __html__(self):
return self._html
class Foo(Base):
__tablename__ = 'foo'
id = Column(Integer, primary_key=True)
a = composite(MarkdownText._from_db,
Column('_text', Text),
Column('_html', Text))
def __init__(self, a):
self.a = MarkdownText(a)
def __repr__(self):
return '(%s)' % (self.a)
Base.metadata.create_all(engine)
session.add_all([Foo('test'), Foo('nips')])
session.commit()
x = session.query(Foo).all()
print x
print x[0].a.__html__
print x[0].a
这给了我们很好的结果:
[(test), (nips)]
<html>test</html>
test
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)