2010-02-22 17 views
16

SQL Alchemy: Topic, Tag, Tag_To_Topic'da 3 sınıfım olduğunu varsayalım. Ben otomatik Etiket tablosundaki 'TaG1', 'TAG2' ve 'TAG3' yerleştirin ve aynı zamanda new_topic ve arasında doğru ilişkiyi eklemek istiyorumSQLAlchemy için çok sayıda ilişkiye veri ekleme

new_topic = Topic("new topic") 
Topics.tags = ['tag1', 'tag2', 'tag3'] 

:

gibi bir şey yazmak için mümkün mü Bu 3 etiketleri Tag_To_Topic tablosunda.

Şimdiye kadar çoktan çoğa ilişkisi nedeniyle bunu nasıl yapacağımı anlayamadım. (Bire çok olduysa, çok kolay olurdu, SQLAlchemy bunu varsayılan olarak yapar. Ama bu çoktan çoğa.)

Bu mümkün mü?

Teşekkürler, Boda Cydo.

cevap

15

association_proxy'u kullanarak çoktan çoğa ilişkinizi basitleştirebilirsiniz.

Ardından, SA yaptığı müdahale etmemek için olduğu gibi ilişkiyi bırakacaktı:

# here *tag_to_topic* is the relation Table object 
Topic.tags = relation('Tag', secondary=tag_to_topic) 

Ve sadece dize çeviri işini yapar, basit bir sarıcı özelliği yaratmanızı tavsiye ilişki nesnelerini listeler (muhtemelen ilişkiyi yeniden adlandırırsınız). Şimdi bu çalışıyorum

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

:

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") 

Sonra bu kod çalışması gerekir: Sizin Etiketler sınıfı benzer olmazdı. Yardım ettiğin için teşekkürler! – bodacydo

+0

Bana yardım ettiğin için sana minnettarlığımı ifade etmek istiyorum Van. İlişkilendirme proxy kullanmayla ilgili öneriniz ve yardımcı yöntemler ekleyerek sınıfı iyileştirmek, büyük bir kod ve çözümle sonuçlandı. Teşekkürler! – bodacydo

+0

Teşekkürler, minibüs. Ancak, "haber" ve o.year> 2010 etiketli tüm konuları (örneğin, Topic() örneğinde rastgele bir özellik) almak için, "etiketleri" nasıl seçersiniz? –

İlgili konular