首先,可以通过使用。 然后,为了不干涉SA所做的事情,我将保留这种关系: # here *tag_to_topic* is the relation Table object
Topic.tags = relation('Tag', secondary=tag_to_topic) 我建议只创建一个简单的包装器属性,它完成将字符串列表转换为关系对象的工作(您可能会重命名关系)。标记类看起来类似于: 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()... 展开详请
def duplicate(self):
arguments = dict()
for name, column in self.__mapper__.columns.items():
if not (column.primary_key or column.unique):
arguments[name] = getattr(self, name)
return self.__class__(**arguments)... 展开详请