在SQLAlchemy的多对多关系中插入数据

在SQLAlchemy的多对多关系中插入数据,sqlalchemy,Sqlalchemy,假设我在SQLALchemy中有3个类:Topic,Tag,Tag\u To\u Topic 有没有可能写出这样的内容: new_topic = Topic("new topic") Topics.tags = ['tag1', 'tag2', 'tag3'] 我想在标记表中自动插入“tag1”、“tag2”和“tag3”,并在新主题和标记到主题表中这3个标记之间插入正确的关系 到目前为止,由于多对多的关系,我还没有弄清楚如何做到这一点。(如果是一对多,那就很容易了,SQLAlchemy默认已

假设我在SQLALchemy中有3个类:
Topic
Tag
Tag\u To\u Topic

有没有可能写出这样的内容:

new_topic = Topic("new topic")
Topics.tags = ['tag1', 'tag2', 'tag3']
我想在标记表中自动插入“tag1”、“tag2”和“tag3”,并在
新主题
标记到主题
表中这3个标记之间插入正确的关系

到目前为止,由于多对多的关系,我还没有弄清楚如何做到这一点。(如果是一对多,那就很容易了,SQLAlchemy默认已经做到了。但这是多对多。)

这可能吗


谢谢,Boda Cydo。

首先,您可以通过使用简化多对多关系

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

# here *tag_to_topic* is the relation Table object
Topic.tags = relation('Tag', secondary=tag_to_topic)
我建议您只需创建一个简单的包装器属性,将字符串列表转换为关系对象(您可能会重命名关系)。您的Tags类将类似于:

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")
那么这个代码应该可以工作了:

# Test
o = Topic()
session.add(o)
session.commit()
o.str_tags = ['tag1']
o.str_tags = ['tag1', 'tag4']
session.commit()

范,我想对你的帮助表示深深的感谢。您建议使用关联代理,并通过添加助手方法来改进类,这带来了非常好的代码和解决方案。谢谢谢谢,范。但是如何“选择”标记,例如,获取所有带有标记“news”和o.year>2010的主题(只是Topic()实例中的任意属性)?