2010-02-22 18 views
16

में कई से कई रिश्ते में डेटा डालने का मान लीजिए कि मेरे पास SQLALchemy में 3 वर्ग हैं: Topic, Tag, Tag_To_TopicSQLAlchemy

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

कौन सा मैं स्वचालित रूप से टैग तालिका में 'tag1', 'tag2' और 'tag3' डालने के लिए, और भी new_topic और के बीच सही संबंध सम्मिलित करना चाहते हैं:

की तरह कुछ लिखने के लिए क्या यह संभव है Tag_To_Topic तालिका में ये 3 टैग।

अभी तक मैं यह समझने में सक्षम नहीं हूं कि कई से अधिक रिश्ते के कारण ऐसा कैसे किया जाए। (यदि यह एक से अधिक था, तो यह बहुत आसान होगा, SQLAlchemy पहले से ही डिफ़ॉल्ट रूप से करता है। लेकिन यह कई से कई है।)

क्या यह संभव है?

धन्यवाद, बोडा साइडो।

उत्तर

15

आप सभी की मुट्ठी association_proxy का उपयोग करके अपने कई से अधिक संबंधों को सरल बना सकते हैं।

फिर, मैं संबंध छोड़ना होगा के रूप में यह आदेश क्या एसए करता है के साथ हस्तक्षेप न में है:

# 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() 
+0

मैं अब इस कोशिश कर रहा हूँ। मदद के लिए बहुत धन्यवाद! – bodacydo

+0

मैं आपकी मदद करने के लिए, वैन, के लिए मेरा गहरा आभार व्यक्त करना चाहता हूं। एसोसिएशन प्रॉक्सी का उपयोग करने और सहायक तरीकों को जोड़कर कक्षा में सुधार करने के आपके सुझाव के परिणामस्वरूप महान कोड और समाधान हुआ। धन्यवाद! – bodacydo

+0

धन्यवाद, वैन। लेकिन उदाहरण के लिए, टैग "समाचार" और o.year> 2010 वाले सभी विषयों को पाने के लिए टैग का चयन कैसे करें (केवल विषय() उदाहरण में एक मनमानी संपत्ति)? –