gpt4 book ai didi

python - 与 sqlalchemy 的通用关系,如 django contenttypes 中那样

转载 作者:行者123 更新时间:2023-11-30 23:53:58 29 4
gpt4 key购买 nike

我正在尝试使用 Sql Alchemy 制作一些通用应用程序,例如任何模型的标签或评级。但我在文档中找不到任何帮助。我真的很喜欢使用 django contenttypes 框架可以做什么? Sql Alchemy 中有类似的功能吗?

最佳答案

我曾经写过一些与此类似的示例代码(请参阅 http://taketwoprogramming.blogspot.com/2009/08/reusable-sqlalchemy-models.html )。

基本思想是您可以创建这样的模型:

@commentable
class Post(Base):
__tablename__ = 'posts'
id = sa.Column(sa.Integer, primary_key=True)
text = sa.Column(sa.String)

...其中可评论的定义如下...

class BaseComment(object):
pass

def build_comment_model(clazz):
class_table_name = str(class_mapper(clazz).local_table)
metadata = clazz.metadata

comment_class_name = clazz.__name__ + 'Comment'
comment_class = type(comment_class_name, (BaseComment,), {})

comment_table_name = class_table_name + '_comments'
comment_table = sa.Table(comment_table_name, metadata,
sa.Column('id', sa.Integer, primary_key=True),
sa.Column(class_table_name + '_id',
sa.Integer,
sa.ForeignKey(class_table_name + '.id')),

sa.Column('text', sa.String),
sa.Column('name', sa.String(100)),
sa.Column('url', sa.String(255)),
)

mapper(comment_class, comment_table)

return comment_class, comment_table

def commentable(clazz):
comment_class, comment_table = build_comment_model(clazz)

clazz.Comment = comment_class
setattr(clazz, 'comments', relation(comment_class))

def add_comment(self, comment):
self.comments.append(comment)

setattr(clazz, 'add_comment', add_comment)

return clazz

基本上,可注释装饰器动态创建新类型和表,以及装饰类的一些辅助方法。这是我用来测试代码是否有效的测试,其中显示了一些代码如何工作的示例......

class TestModels(SATestCase):
def test_make_comment(self):
p = Post()
p.text = 'SQLAlchemy is amazing!'

text = 'I agree!'
name = 'Mark'
url = 'http://www.sqlalchemy.org/'

c = Post.Comment()
c.text = text
c.name = name
c.url = url
p.add_comment(c)
Session.add(p)

# This is a method I use to force the reload of the objects from
# the database to make sure that when I test them, I'm actually
# pulling from the database rather than just getting the data
# of the object still in the session.
p = self.reload(p)

self.assertEquals(len(p.comments), 1)
c = p.comments[0]
self.assertEquals(c.text, text)
self.assertEquals(c.name, name)
self.assertEquals(c.url, url)

我不久前写过这篇文章,但我认为 SQLA 中没有任何东西可以为你做这种事情,但你可以创建类似的东西而不用太麻烦。在我的示例中,我创建了新的映射类和方法,以便在类装饰器中动态使用它。

我从来没有真正利用过它,但它可能会给你一些想法。

关于python - 与 sqlalchemy 的通用关系,如 django contenttypes 中那样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5385992/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com