首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在SQLAlchemy中以多对多关系插入数据

在SQLAlchemy中以多对多关系插入数据
EN

Stack Overflow用户
提问于 2010-02-22 18:14:05
回答 1查看 8.5K关注 0票数 17

假设我在SQLALchemy中有3个类:TopicTagTag_To_Topic

有没有可能写成这样:

代码语言:javascript
复制
new_topic = Topic("new topic")
Topics.tags = ['tag1', 'tag2', 'tag3']

我想在Tag表中自动插入'tag1','tag2‘和'tag3’,并在Tag_To_Topic表中正确插入new_topic和这3个标签之间的关系。

到目前为止,由于多对多的关系,我还不能想出如何做到这一点。(如果是一对多,那就很简单了,SQLAlchemy已经默认了。但这是多对多。)

这个是可能的吗?

谢谢,波达·西多。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-02-22 19:31:27

首先,您可以使用association_proxy简化多对多关系。

然后,为了不干扰SA所做的工作,我将保持关系不变:

代码语言:javascript
复制
# here *tag_to_topic* is the relation Table object
Topic.tags = relation('Tag', secondary=tag_to_topic)

我建议您只创建一个简单的包装器属性来完成将字符串列表转换为关系对象的工作(您可能会重命名关系)。您的标记类将类似于:

代码语言:javascript
复制
class Topic(Base):
    __tablename__ = 'topic'
    id = Column(Integer, primary_key=True)
    # ... other properties

    def _find_or_create_tag(self, tag):
        q = Tag.query.filter_by(name=tag)
        t = q.first()
        if not(t):
            t = Tag(tag)
        return t

    def _get_tags(self):
        return [x.name for x in self.tags]

    def _set_tags(self, value):
        # clear the list first
        while self.tags:
            del self.tags[0]
        # add new tags
        for tag in value:
            self.tags.append(self._find_or_create_tag(tag))

    str_tags = property(_get_tags,
                        _set_tags,
                        "Property str_tags is a simple wrapper for tags relation")

那么这段代码应该可以工作了:

代码语言:javascript
复制
# Test
o = Topic()
session.add(o)
session.commit()
o.str_tags = ['tag1']
o.str_tags = ['tag1', 'tag4']
session.commit()
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2310153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档