您可以通過使用association_proxy來簡化您的多對多關係。
然後,我會離開的關係,因爲它是爲了不與什麼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()
來源
2010-02-22 11:31:26
van
我現在想這個。非常感謝您的幫助! – bodacydo 2010-02-22 12:05:15
我想向你表示深深的謝意,Van,幫助我。您使用關聯代理的建議,以及通過添加輔助方法來改進類的結果都是很好的代碼和解決方案。謝謝! – bodacydo 2010-02-23 09:59:08
謝謝,麪包車。但是,如何「選擇」標籤,例如,讓標籤爲「news」和o.year> 2010的所有主題(只是Topic()實例中的一個任意屬性)? – 2014-08-25 08:24:57